libavcodec/ivi_common.c
Go to the documentation of this file.
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 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             if (!new_huff.num_rows) {
00127                 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
00128                 return AVERROR_INVALIDDATA;
00129             }
00130 
00131             for (i = 0; i < new_huff.num_rows; i++)
00132                 new_huff.xbits[i] = get_bits(gb, 4);
00133 
00134             /* Have we got the same custom table? Rebuild if not. */
00135             if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
00136                 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00137 
00138                 if (huff_tab->cust_tab.table)
00139                     ff_free_vlc(&huff_tab->cust_tab);
00140                 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
00141                         &huff_tab->cust_tab, 0);
00142                 if (result) {
00143                     huff_tab->cust_desc.num_rows = 0; // reset faulty description
00144                     av_log(avctx, AV_LOG_ERROR,
00145                            "Error while initializing custom vlc table!\n");
00146                     return result;
00147                 }
00148             }
00149             huff_tab->tab = &huff_tab->cust_tab;
00150         } else {
00151             /* select one of predefined tables */
00152             huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
00153                 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
00154         }
00155     }
00156 
00157     return 0;
00158 }
00159 
00160 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00161 {
00162     return    desc1->num_rows != desc2->num_rows
00163            || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00164 }
00165 
00166 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00167 {
00168     dst->num_rows = src->num_rows;
00169     memcpy(dst->xbits, src->xbits, src->num_rows);
00170 }
00171 
00172 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00173 {
00174     int         p, b;
00175     uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00176     IVIBandDesc *band;
00177 
00178     ff_ivi_free_buffers(planes);
00179 
00180     /* fill in the descriptor of the luminance plane */
00181     planes[0].width     = cfg->pic_width;
00182     planes[0].height    = cfg->pic_height;
00183     planes[0].num_bands = cfg->luma_bands;
00184 
00185     /* fill in the descriptors of the chrominance planes */
00186     planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
00187     planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
00188     planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00189 
00190     for (p = 0; p < 3; p++) {
00191         planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00192         if (!planes[p].bands)
00193             return AVERROR(ENOMEM);
00194 
00195         /* select band dimensions: if there is only one band then it
00196          *  has the full size, if there are several bands each of them
00197          *  has only half size */
00198         b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
00199         b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00200 
00201         /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
00202         /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
00203         align_fac       = p ? 8 : 16;
00204         width_aligned   = FFALIGN(b_width , align_fac);
00205         height_aligned  = FFALIGN(b_height, align_fac);
00206         buf_size        = width_aligned * height_aligned * sizeof(int16_t);
00207 
00208         for (b = 0; b < planes[p].num_bands; b++) {
00209             band = &planes[p].bands[b]; /* select appropriate plane/band */
00210             band->plane    = p;
00211             band->band_num = b;
00212             band->width    = b_width;
00213             band->height   = b_height;
00214             band->pitch    = width_aligned;
00215             band->aheight  = height_aligned;
00216             band->bufs[0]  = av_mallocz(buf_size);
00217             band->bufs[1]  = av_mallocz(buf_size);
00218             if (!band->bufs[0] || !band->bufs[1])
00219                 return AVERROR(ENOMEM);
00220 
00221             /* allocate the 3rd band buffer for scalability mode */
00222             if (cfg->luma_bands > 1) {
00223                 band->bufs[2] = av_mallocz(buf_size);
00224                 if (!band->bufs[2])
00225                     return AVERROR(ENOMEM);
00226             }
00227 
00228             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
00229         }
00230     }
00231 
00232     return 0;
00233 }
00234 
00235 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
00236 {
00237     int p, b, t;
00238 
00239     for (p = 0; p < 3; p++) {
00240         for (b = 0; b < planes[p].num_bands; b++) {
00241             av_freep(&planes[p].bands[b].bufs[0]);
00242             av_freep(&planes[p].bands[b].bufs[1]);
00243             av_freep(&planes[p].bands[b].bufs[2]);
00244 
00245             if (planes[p].bands[b].blk_vlc.cust_tab.table)
00246                 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00247             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00248                 av_freep(&planes[p].bands[b].tiles[t].mbs);
00249             av_freep(&planes[p].bands[b].tiles);
00250         }
00251         av_freep(&planes[p].bands);
00252     }
00253 }
00254 
00255 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00256 {
00257     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00258     IVIBandDesc *band;
00259     IVITile     *tile, *ref_tile;
00260 
00261     for (p = 0; p < 3; p++) {
00262         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
00263         t_height = !p ? tile_height : (tile_height + 3) >> 2;
00264 
00265         if (!p && planes[0].num_bands == 4) {
00266             t_width  >>= 1;
00267             t_height >>= 1;
00268         }
00269 
00270         for (b = 0; b < planes[p].num_bands; b++) {
00271             band = &planes[p].bands[b];
00272             x_tiles = IVI_NUM_TILES(band->width, t_width);
00273             y_tiles = IVI_NUM_TILES(band->height, t_height);
00274             band->num_tiles = x_tiles * y_tiles;
00275 
00276             av_freep(&band->tiles);
00277             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00278             if (!band->tiles)
00279                 return AVERROR(ENOMEM);
00280 
00281             tile = band->tiles;
00282 
00283             /* use the first luma band as reference for motion vectors
00284              * and quant */
00285             ref_tile = planes[0].bands[0].tiles;
00286 
00287             for (y = 0; y < band->height; y += t_height) {
00288                 for (x = 0; x < band->width; x += t_width) {
00289                     tile->xpos     = x;
00290                     tile->ypos     = y;
00291                     tile->mb_size  = band->mb_size;
00292                     tile->width    = FFMIN(band->width - x,  t_width);
00293                     tile->height   = FFMIN(band->height - y, t_height);
00294                     tile->is_empty = tile->data_size = 0;
00295                     /* calculate number of macroblocks */
00296                     tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
00297                                                       band->mb_size);
00298 
00299                     av_freep(&tile->mbs);
00300                     tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00301                     if (!tile->mbs)
00302                         return AVERROR(ENOMEM);
00303 
00304                     tile->ref_mbs = 0;
00305                     if (p || b) {
00306                         tile->ref_mbs = ref_tile->mbs;
00307                         ref_tile++;
00308                     }
00309 
00310                     tile++;
00311                 }
00312             }
00313 
00314         }// for b
00315     }// for p
00316 
00317     return 0;
00318 }
00319 
00320 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00321 {
00322     int    len;
00323 
00324     len = 0;
00325     if (get_bits1(gb)) {
00326         len = get_bits(gb, 8);
00327         if (len == 255)
00328             len = get_bits_long(gb, 24);
00329     }
00330 
00331     /* align the bitstream reader on the byte boundary */
00332     align_get_bits(gb);
00333 
00334     return len;
00335 }
00336 
00337 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00338 {
00339     int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00340                 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
00341     uint8_t     col_flags[8];
00342     int32_t     prev_dc, trvec[64];
00343     uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
00344     IVIMbInfo   *mb;
00345     RVMapDesc   *rvmap = band->rv_map;
00346     void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00347     void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00348     const uint16_t  *base_tab;
00349     const uint8_t   *scale_tab;
00350 
00351     prev_dc = 0; /* init intra prediction for the DC coefficient */
00352 
00353     blk_size   = band->blk_size;
00354     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
00355     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
00356     num_coeffs = blk_size * blk_size;
00357     if (blk_size == 8) {
00358         mc_with_delta_func = ff_ivi_mc_8x8_delta;
00359         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
00360     } else {
00361         mc_with_delta_func = ff_ivi_mc_4x4_delta;
00362         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
00363     }
00364 
00365     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00366         is_intra = !mb->type;
00367         cbp      = mb->cbp;
00368         buf_offs = mb->buf_offs;
00369 
00370         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00371 
00372         base_tab  = is_intra ? band->intra_base  : band->inter_base;
00373         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00374         if (scale_tab)
00375             quant = scale_tab[quant];
00376 
00377         if (!is_intra) {
00378             mv_x = mb->mv_x;
00379             mv_y = mb->mv_y;
00380             if (!band->is_halfpel) {
00381                 mc_type = 0; /* we have only fullpel vectors */
00382             } else {
00383                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00384                 mv_x >>= 1;
00385                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00386             }
00387             if (mb->type) {
00388                 int dmv_x, dmv_y, cx, cy;
00389 
00390                 dmv_x = mb->mv_x >> band->is_halfpel;
00391                 dmv_y = mb->mv_y >> band->is_halfpel;
00392                 cx    = mb->mv_x &  band->is_halfpel;
00393                 cy    = mb->mv_y &  band->is_halfpel;
00394 
00395                 if (   mb->xpos + dmv_x < 0
00396                     || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
00397                     || mb->ypos + dmv_y < 0
00398                     || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
00399                     return AVERROR_INVALIDDATA;
00400                 }
00401             }
00402         }
00403 
00404         for (blk = 0; blk < num_blocks; blk++) {
00405             /* adjust block position in the buffer according to its number */
00406             if (blk & 1) {
00407                 buf_offs += blk_size;
00408             } else if (blk == 2) {
00409                 buf_offs -= blk_size;
00410                 buf_offs += blk_size * band->pitch;
00411             }
00412 
00413             if (cbp & 1) { /* block coded ? */
00414                 scan_pos = -1;
00415                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
00416                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
00417 
00418                 while (scan_pos <= num_coeffs) {
00419                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00420                     if (sym == rvmap->eob_sym)
00421                         break; /* End of block */
00422 
00423                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
00424                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00425                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00426                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00427                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
00428                     } else {
00429                         if (sym >= 256U) {
00430                             av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00431                             return -1;
00432                         }
00433                         run = rvmap->runtab[sym];
00434                         val = rvmap->valtab[sym];
00435                     }
00436 
00437                     /* de-zigzag and dequantize */
00438                     scan_pos += run;
00439                     if (scan_pos >= num_coeffs)
00440                         break;
00441                     pos = band->scan[scan_pos];
00442 
00443                     if (!val)
00444                         av_dlog(NULL, "Val = 0 encountered!\n");
00445 
00446                     q = (base_tab[pos] * quant) >> 9;
00447                     if (q > 1)
00448                         val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00449                     trvec[pos] = val;
00450                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
00451                 }// while
00452 
00453                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00454                     return -1; /* corrupt block data */
00455 
00456                 /* undoing DC coeff prediction for intra-blocks */
00457                 if (is_intra && band->is_2d_trans) {
00458                     prev_dc      += trvec[0];
00459                     trvec[0]      = prev_dc;
00460                     col_flags[0] |= !!prev_dc;
00461                 }
00462 
00463                 /* apply inverse transform */
00464                 band->inv_transform(trvec, band->buf + buf_offs,
00465                                     band->pitch, col_flags);
00466 
00467                 /* apply motion compensation */
00468                 if (!is_intra)
00469                     mc_with_delta_func(band->buf + buf_offs,
00470                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00471                                        band->pitch, mc_type);
00472             } else {
00473                 /* block not coded */
00474                 /* for intra blocks apply the dc slant transform */
00475                 /* for inter - perform the motion compensation without delta */
00476                 if (is_intra && band->dc_transform) {
00477                     band->dc_transform(&prev_dc, band->buf + buf_offs,
00478                                        band->pitch, blk_size);
00479                 } else
00480                     mc_no_delta_func(band->buf + buf_offs,
00481                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00482                                      band->pitch, mc_type);
00483             }
00484 
00485             cbp >>= 1;
00486         }// for blk
00487     }// for mbn
00488 
00489     align_get_bits(gb);
00490 
00491     return 0;
00492 }
00493 
00503 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00504                                   IVITile *tile, int32_t mv_scale)
00505 {
00506     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00507     int             offs, mb_offset, row_offset;
00508     IVIMbInfo       *mb, *ref_mb;
00509     const int16_t   *src;
00510     int16_t         *dst;
00511     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00512                              int mc_type);
00513 
00514     if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
00515         av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
00516                "parameters %d in ivi_process_empty_tile()\n",
00517                tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00518         return AVERROR_INVALIDDATA;
00519     }
00520 
00521     offs       = tile->ypos * band->pitch + tile->xpos;
00522     mb         = tile->mbs;
00523     ref_mb     = tile->ref_mbs;
00524     row_offset = band->mb_size * band->pitch;
00525     need_mc    = 0; /* reset the mc tracking flag */
00526 
00527     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00528         mb_offset = offs;
00529 
00530         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00531             mb->xpos     = x;
00532             mb->ypos     = y;
00533             mb->buf_offs = mb_offset;
00534 
00535             mb->type = 1; /* set the macroblocks type = INTER */
00536             mb->cbp  = 0; /* all blocks are empty */
00537 
00538             if (!band->qdelta_present && !band->plane && !band->band_num) {
00539                 mb->q_delta = band->glob_quant;
00540                 mb->mv_x    = 0;
00541                 mb->mv_y    = 0;
00542             }
00543 
00544             if (band->inherit_qdelta && ref_mb)
00545                 mb->q_delta = ref_mb->q_delta;
00546 
00547             if (band->inherit_mv) {
00548                 /* motion vector inheritance */
00549                 if (mv_scale) {
00550                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00551                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00552                 } else {
00553                     mb->mv_x = ref_mb->mv_x;
00554                     mb->mv_y = ref_mb->mv_y;
00555                 }
00556                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
00557             }
00558 
00559             mb++;
00560             if (ref_mb)
00561                 ref_mb++;
00562             mb_offset += band->mb_size;
00563         } // for x
00564         offs += row_offset;
00565     } // for y
00566 
00567     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
00568         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
00569         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00570                                                  : ff_ivi_mc_4x4_no_delta;
00571 
00572         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00573             mv_x = mb->mv_x;
00574             mv_y = mb->mv_y;
00575             if (!band->is_halfpel) {
00576                 mc_type = 0; /* we have only fullpel vectors */
00577             } else {
00578                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00579                 mv_x >>= 1;
00580                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00581             }
00582 
00583             for (blk = 0; blk < num_blocks; blk++) {
00584                 /* adjust block position in the buffer according with its number */
00585                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00586                 mc_no_delta_func(band->buf + offs,
00587                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
00588                                  band->pitch, mc_type);
00589             }
00590         }
00591     } else {
00592         /* copy data from the reference tile into the current one */
00593         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00594         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
00595         for (y = 0; y < tile->height; y++) {
00596             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00597             src += band->pitch;
00598             dst += band->pitch;
00599         }
00600     }
00601 
00602     return 0;
00603 }
00604 
00605 
00606 #ifdef DEBUG
00607 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00608 {
00609     int         x, y;
00610     int16_t     *src, checksum;
00611 
00612     src = band->buf;
00613     checksum = 0;
00614 
00615     for (y = 0; y < band->height; src += band->pitch, y++)
00616         for (x = 0; x < band->width; x++)
00617             checksum += src[x];
00618 
00619     return checksum;
00620 }
00621 
00622 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00623 {
00624     int         x, y, result;
00625     uint8_t     t1, t2;
00626     int16_t    *src;
00627 
00628     src = band->buf;
00629     result = 0;
00630 
00631     for (y = 0; y < band->height; src += band->pitch, y++) {
00632         for (x = 0; x < band->width; x++) {
00633             t1 = av_clip(src[x] + 128, 0, 255);
00634             t2 = ref[x];
00635             if (t1 != t2) {
00636                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00637                        y / band->blk_size, x / band->blk_size);
00638                 result = -1;
00639             }
00640         }
00641         ref += pitch;
00642     }
00643 
00644     return result;
00645 }
00646 #endif
00647 
00648 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00649 {
00650     int             x, y;
00651     const int16_t   *src  = plane->bands[0].buf;
00652     uint32_t        pitch = plane->bands[0].pitch;
00653 
00654     if (!src)
00655         return;
00656 
00657     for (y = 0; y < plane->height; y++) {
00658         for (x = 0; x < plane->width; x++)
00659             dst[x] = av_clip_uint8(src[x] + 128);
00660         src += pitch;
00661         dst += dst_pitch;
00662     }
00663 }
00664 
00673 static int decode_band(IVI45DecContext *ctx, int plane_num,
00674                        IVIBandDesc *band, AVCodecContext *avctx)
00675 {
00676     int         result, i, t, idx1, idx2, pos;
00677     IVITile     *tile;
00678 
00679     band->buf     = band->bufs[ctx->dst_buf];
00680     band->ref_buf = band->bufs[ctx->ref_buf];
00681     band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
00682 
00683     result = ctx->decode_band_hdr(ctx, band, avctx);
00684     if (result) {
00685         av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
00686                result);
00687         return result;
00688     }
00689 
00690     if (band->is_empty) {
00691         av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
00692         return AVERROR_INVALIDDATA;
00693     }
00694 
00695     band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
00696 
00697     /* apply corrections to the selected rvmap table if present */
00698     for (i = 0; i < band->num_corr; i++) {
00699         idx1 = band->corr[i * 2];
00700         idx2 = band->corr[i * 2 + 1];
00701         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00702         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00703     }
00704 
00705     pos = get_bits_count(&ctx->gb);
00706 
00707     for (t = 0; t < band->num_tiles; t++) {
00708         tile = &band->tiles[t];
00709 
00710         if (tile->mb_size != band->mb_size) {
00711             av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
00712                    band->mb_size, tile->mb_size);
00713             return AVERROR_INVALIDDATA;
00714         }
00715         tile->is_empty = get_bits1(&ctx->gb);
00716         if (tile->is_empty) {
00717             result = ivi_process_empty_tile(avctx, band, tile,
00718                                       (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
00719             if (result < 0)
00720                 break;
00721             av_dlog(avctx, "Empty tile encountered!\n");
00722         } else {
00723             tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
00724             if (!tile->data_size) {
00725                 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
00726                 return AVERROR_INVALIDDATA;
00727             }
00728 
00729             result = ctx->decode_mb_info(ctx, band, tile, avctx);
00730             if (result < 0)
00731                 break;
00732 
00733             result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
00734             if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
00735                 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
00736                 break;
00737             }
00738 
00739             pos += tile->data_size << 3; // skip to next tile
00740         }
00741     }
00742 
00743     /* restore the selected rvmap table by applying its corrections in reverse order */
00744     for (i = band->num_corr-1; i >= 0; i--) {
00745         idx1 = band->corr[i*2];
00746         idx2 = band->corr[i*2+1];
00747         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00748         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00749     }
00750 
00751 #ifdef DEBUG
00752     if (band->checksum_present) {
00753         uint16_t chksum = ivi_calc_band_checksum(band);
00754         if (chksum != band->checksum) {
00755             av_log(avctx, AV_LOG_ERROR,
00756                    "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
00757                    band->plane, band->band_num, band->checksum, chksum);
00758         }
00759     }
00760 #endif
00761 
00762     align_get_bits(&ctx->gb);
00763 
00764     return result;
00765 }
00766 
00767 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
00768                         AVPacket *avpkt)
00769 {
00770     IVI45DecContext *ctx = avctx->priv_data;
00771     const uint8_t   *buf = avpkt->data;
00772     int             buf_size = avpkt->size;
00773     int             result, p, b;
00774 
00775     init_get_bits(&ctx->gb, buf, buf_size * 8);
00776     ctx->frame_data = buf;
00777     ctx->frame_size = buf_size;
00778 
00779     result = ctx->decode_pic_hdr(ctx, avctx);
00780     if (result) {
00781         av_log(avctx, AV_LOG_ERROR,
00782                "Error while decoding picture header: %d\n", result);
00783         return -1;
00784     }
00785     if (ctx->gop_invalid)
00786         return AVERROR_INVALIDDATA;
00787 
00788     if (ctx->gop_flags & IVI5_IS_PROTECTED) {
00789         av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
00790         return -1;
00791     }
00792 
00793     ctx->switch_buffers(ctx);
00794 
00795     //{ START_TIMER;
00796 
00797     if (ctx->is_nonnull_frame(ctx)) {
00798         for (p = 0; p < 3; p++) {
00799             for (b = 0; b < ctx->planes[p].num_bands; b++) {
00800                 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
00801                 if (result) {
00802                     av_log(avctx, AV_LOG_ERROR,
00803                            "Error while decoding band: %d, plane: %d\n", b, p);
00804                     return -1;
00805                 }
00806             }
00807         }
00808     }
00809 
00810     //STOP_TIMER("decode_planes"); }
00811 
00812     /* If the bidirectional mode is enabled, next I and the following P frame will */
00813     /* be sent together. Unfortunately the approach below seems to be the only way */
00814     /* to handle the B-frames mode. That's exactly the same Intel decoders do.     */
00815     if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
00816         while (get_bits(&ctx->gb, 8)); // skip version string
00817         skip_bits_long(&ctx->gb, 64);  // skip padding, TODO: implement correct 8-bytes alignment
00818         if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
00819             av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
00820     }
00821 
00822     if (ctx->frame.data[0])
00823         avctx->release_buffer(avctx, &ctx->frame);
00824 
00825     ctx->frame.reference = 0;
00826     avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
00827     if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
00828         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00829         return result;
00830     }
00831 
00832     if (ctx->is_scalable) {
00833         if (avctx->codec_id == CODEC_ID_INDEO4)
00834             ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00835         else
00836             ff_ivi_recompose53   (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
00837     } else {
00838         ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00839     }
00840 
00841     ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
00842     ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
00843 
00844     *data_size = sizeof(AVFrame);
00845     *(AVFrame*)data = ctx->frame;
00846 
00847     return buf_size;
00848 }
00849 
00853 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
00854 {
00855     IVI45DecContext *ctx = avctx->priv_data;
00856 
00857     ff_ivi_free_buffers(&ctx->planes[0]);
00858 
00859     if (ctx->mb_vlc.cust_tab.table)
00860         ff_free_vlc(&ctx->mb_vlc.cust_tab);
00861 
00862     if (ctx->frame.data[0])
00863         avctx->release_buffer(avctx, &ctx->frame);
00864 
00865 #if IVI4_STREAM_ANALYSER
00866     if (avctx->codec_id == CODEC_ID_INDEO4) {
00867     if (ctx->is_scalable)
00868         av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
00869     if (ctx->uses_tiling)
00870         av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
00871     if (ctx->has_b_frames)
00872         av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
00873     if (ctx->has_transp)
00874         av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
00875     if (ctx->uses_haar)
00876         av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
00877     if (ctx->uses_fullpel)
00878         av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
00879     }
00880 #endif
00881 
00882     return 0;
00883 }
00884 
00885 
00892 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00893     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
00894     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00895     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00896     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00897     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00898     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00899     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00900     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00901 };
00902 
00903 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00904     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00905     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00906     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00907     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00908     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00909     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00910     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00911     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00912 };
00913 
00914 
00918 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00919     0,  8, 16, 24, 32, 40, 48, 56,
00920     1,  9, 17, 25, 33, 41, 49, 57,
00921     2, 10, 18, 26, 34, 42, 50, 58,
00922     3, 11, 19, 27, 35, 43, 51, 59,
00923     4, 12, 20, 28, 36, 44, 52, 60,
00924     5, 13, 21, 29, 37, 45, 53, 61,
00925     6, 14, 22, 30, 38, 46, 54, 62,
00926     7, 15, 23, 31, 39, 47, 55, 63
00927 };
00928 
00929 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00930      0,  1,  2,  3,  4,  5,  6,  7,
00931      8,  9, 10, 11, 12, 13, 14, 15,
00932     16, 17, 18, 19, 20, 21, 22, 23,
00933     24, 25, 26, 27, 28, 29, 30, 31,
00934     32, 33, 34, 35, 36, 37, 38, 39,
00935     40, 41, 42, 43, 44, 45, 46, 47,
00936     48, 49, 50, 51, 52, 53, 54, 55,
00937     56, 57, 58, 59, 60, 61, 62, 63
00938 };
00939 
00940 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00941     0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00942 };
00943 
00944 
00948 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00949 {   /* MapTab0 */
00950     5, /* eob_sym */
00951     2, /* esc_sym */
00952     /* run table */
00953     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
00954      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
00955      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
00956      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
00957      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
00958      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
00959      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
00960      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
00961      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
00962      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
00963     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
00964      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
00965      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
00966      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
00967      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
00968     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00969 
00970     /* value table */
00971     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
00972       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
00973      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
00974       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
00975      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
00976       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
00977       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
00978       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
00979      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
00980       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
00981      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
00982       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
00983     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
00984      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
00985       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
00986      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
00987 },{
00988     /* MapTab1 */
00989     0,  /* eob_sym */
00990     38, /* esc_sym */
00991     /* run table */
00992     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
00993      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
00994     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00995     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
00996     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
00997     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
00998     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
00999     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
01000     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
01001     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
01002     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
01003      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
01004     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
01005     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
01006     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
01007      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
01008 
01009     /* value table */
01010     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
01011     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
01012     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
01013      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
01014      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
01015      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
01016     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
01017     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
01018      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
01019      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
01020      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
01021      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
01022      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
01023      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
01024     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
01025     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
01026 },{
01027     /* MapTab2 */
01028     2,  /* eob_sym */
01029     11, /* esc_sym */
01030     /* run table */
01031     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
01032      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
01033      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
01034      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
01035      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
01036      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
01037     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
01038     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
01039     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
01040      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
01041      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
01042     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
01043     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
01044     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
01045      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
01046      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
01047 
01048     /* value table */
01049     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
01050       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
01051      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
01052       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
01053       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
01054       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
01055       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
01056       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
01057       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
01058      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
01059     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
01060      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
01061       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
01062      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
01063      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
01064      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
01065 },{
01066     /* MapTab3 */
01067     0,  /* eob_sym */
01068     35, /* esc_sym */
01069     /* run table */
01070     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
01071      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
01072      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
01073      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
01074     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
01075      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
01076      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
01077     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
01078     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
01079     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
01080     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
01081      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
01082     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
01083     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
01084     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
01085     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
01086 
01087     /* value table */
01088     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
01089      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
01090      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
01091       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
01092       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
01093       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
01094       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
01095      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
01096       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
01097       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
01098      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
01099      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
01100      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
01101       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
01102      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
01103      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
01104 },{
01105     /* MapTab4 */
01106     0,  /* eob_sym */
01107     34, /* esc_sym */
01108     /* run table */
01109     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
01110      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
01111      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
01112      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
01113      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
01114      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
01115      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
01116      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
01117      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
01118      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
01119      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
01120      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
01121      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
01122      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
01123      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
01124      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
01125 
01126     /* value table */
01127     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
01128       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
01129       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
01130       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
01131      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
01132      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
01133       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
01134       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
01135       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
01136     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
01137     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
01138      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
01139     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
01140       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
01141      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
01142      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
01143 },{
01144     /* MapTab5 */
01145     2,  /* eob_sym */
01146     33, /* esc_sym */
01147     /* run table */
01148     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
01149      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
01150      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
01151     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
01152      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
01153      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
01154      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
01155      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
01156      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
01157      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
01158      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
01159      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
01160      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
01161     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
01162      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
01163     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
01164 
01165     /* value table */
01166     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
01167      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
01168      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
01169       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
01170       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
01171       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
01172      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
01173      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
01174     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
01175      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
01176      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
01177       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
01178      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
01179      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
01180      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
01181      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
01182 },{
01183     /* MapTab6 */
01184     2,  /* eob_sym */
01185     13, /* esc_sym */
01186     /* run table */
01187     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
01188      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
01189      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
01190      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
01191      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
01192      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
01193     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
01194      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
01195     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
01196      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
01197      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
01198      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
01199      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
01200     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
01201      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
01202     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
01203 
01204     /* value table */
01205     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
01206        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
01207        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
01208        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
01209      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
01210        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
01211       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
01212       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
01213        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
01214       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
01215       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
01216      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
01217       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
01218       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
01219        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
01220        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
01221 },{
01222     /* MapTab7 */
01223     2,  /* eob_sym */
01224     38, /* esc_sym */
01225     /* run table */
01226     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
01227      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
01228      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
01229     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
01230      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
01231     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
01232     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
01233     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
01234     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
01235     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
01236      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
01237     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
01238      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
01239      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
01240      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
01241     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
01242 
01243     /* value table */
01244     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
01245      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
01246      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
01247       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
01248       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
01249      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
01250      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
01251       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
01252      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
01253      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
01254      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
01255      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
01256      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
01257      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
01258       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
01259       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
01260 },{
01261     /* MapTab8 */
01262     4,  /* eob_sym */
01263     11, /* esc_sym */
01264     /* run table */
01265     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
01266      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
01267      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
01268      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
01269      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
01270      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
01271      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
01272     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
01273      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
01274      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
01275      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
01276     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
01277     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
01278      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
01279     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
01280     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
01281 
01282     /* value table */
01283     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
01284       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
01285       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
01286       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
01287      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
01288       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
01289      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
01290       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
01291     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
01292      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
01293       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
01294       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
01295      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
01296       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
01297       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
01298       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
01299 }
01300 };