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