Libav 0.7.1
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 ALT_BITSTREAM_READER_LE
00030 #include "avcodec.h"
00031 #include "get_bits.h"
00032 #include "ivi_common.h"
00033 #include "libavutil/common.h"
00034 #include "ivi_dsp.h"
00035 
00036 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  
00037 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; 
00038 
00039 VLC ff_ivi_mb_vlc_tabs [8];
00040 VLC ff_ivi_blk_vlc_tabs[8];
00041 
00046 static uint16_t inv_bits(uint16_t val, int nbits)
00047 {
00048     uint16_t res;
00049 
00050     if (nbits <= 8) {
00051         res = av_reverse[val] >> (8-nbits);
00052     } else
00053         res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
00054 
00055     return res;
00056 }
00057 
00058 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
00059 {
00060     int         pos, i, j, codes_per_row, prefix, not_last_row;
00061     uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
00062     uint8_t     bits[256];
00063 
00064     pos = 0; /* current position = 0 */
00065 
00066     for (i = 0; i < cb->num_rows; i++) {
00067         codes_per_row = 1 << cb->xbits[i];
00068         not_last_row  = (i != cb->num_rows - 1);
00069         prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
00070 
00071         for (j = 0; j < codes_per_row; j++) {
00072             if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
00073                 break;      /* elements, but only 256 codes are allowed! */
00074 
00075             bits[pos] = i + cb->xbits[i] + not_last_row;
00076             if (bits[pos] > IVI_VLC_BITS)
00077                 return -1; /* invalid descriptor */
00078 
00079             codewords[pos] = inv_bits((prefix | j), bits[pos]);
00080             if (!bits[pos])
00081                 bits[pos] = 1;
00082 
00083             pos++;
00084         }//for j
00085     }//for i
00086 
00087     /* number of codewords = pos */
00088     return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
00089                     (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
00090 }
00091 
00092 void ff_ivi_init_static_vlc(void)
00093 {
00094     int i;
00095     static VLC_TYPE table_data[8192 * 16][2];
00096     static int initialized_vlcs = 0;
00097 
00098     if (initialized_vlcs)
00099         return;
00100     for (i = 0; i < 8; i++) {
00101         ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
00102         ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
00103         ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],  &ff_ivi_mb_vlc_tabs[i],  1);
00104         ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
00105         ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
00106         ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
00107     }
00108     initialized_vlcs = 1;
00109 }
00110 
00111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
00112                          IVIHuffTab *huff_tab, AVCodecContext *avctx)
00113 {
00114     int         i, result;
00115     IVIHuffDesc new_huff;
00116 
00117     if (!desc_coded) {
00118         /* select default table */
00119         huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
00120             : &ff_ivi_mb_vlc_tabs [7];
00121     } else {
00122         huff_tab->tab_sel = get_bits(gb, 3);
00123         if (huff_tab->tab_sel == 7) {
00124             /* custom huffman table (explicitly encoded) */
00125             new_huff.num_rows = get_bits(gb, 4);
00126 
00127             for (i = 0; i < new_huff.num_rows; i++)
00128                 new_huff.xbits[i] = get_bits(gb, 4);
00129 
00130             /* Have we got the same custom table? Rebuild if not. */
00131             if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
00132                 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00133 
00134                 if (huff_tab->cust_tab.table)
00135                     free_vlc(&huff_tab->cust_tab);
00136                 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
00137                         &huff_tab->cust_tab, 0);
00138                 if (result) {
00139                     av_log(avctx, AV_LOG_ERROR,
00140                            "Error while initializing custom vlc table!\n");
00141                     return -1;
00142                 }
00143             }
00144             huff_tab->tab = &huff_tab->cust_tab;
00145         } else {
00146             /* select one of predefined tables */
00147             huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
00148                 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
00149         }
00150     }
00151 
00152     return 0;
00153 }
00154 
00155 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00156 {
00157     return    desc1->num_rows != desc2->num_rows
00158            || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00159 }
00160 
00161 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00162 {
00163     dst->num_rows = src->num_rows;
00164     memcpy(dst->xbits, src->xbits, src->num_rows);
00165 }
00166 
00167 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00168 {
00169     int         p, b;
00170     uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00171     IVIBandDesc *band;
00172 
00173     ff_ivi_free_buffers(planes);
00174 
00175     /* fill in the descriptor of the luminance plane */
00176     planes[0].width     = cfg->pic_width;
00177     planes[0].height    = cfg->pic_height;
00178     planes[0].num_bands = cfg->luma_bands;
00179 
00180     /* fill in the descriptors of the chrominance planes */
00181     planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
00182     planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
00183     planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00184 
00185     for (p = 0; p < 3; p++) {
00186         planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00187         if (!planes[p].bands)
00188             return AVERROR(ENOMEM);
00189 
00190         /* select band dimensions: if there is only one band then it
00191          *  has the full size, if there are several bands each of them
00192          *  has only half size */
00193         b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
00194         b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00195 
00196         /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
00197         /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
00198         align_fac       = p ? 8 : 16;
00199         width_aligned   = FFALIGN(b_width , align_fac);
00200         height_aligned  = FFALIGN(b_height, align_fac);
00201         buf_size        = width_aligned * height_aligned * sizeof(int16_t);
00202 
00203         for (b = 0; b < planes[p].num_bands; b++) {
00204             band = &planes[p].bands[b]; /* select appropriate plane/band */
00205             band->plane    = p;
00206             band->band_num = b;
00207             band->width    = b_width;
00208             band->height   = b_height;
00209             band->pitch    = width_aligned;
00210             band->bufs[0]  = av_malloc(buf_size);
00211             band->bufs[1]  = av_malloc(buf_size);
00212             if (!band->bufs[0] || !band->bufs[1])
00213                 return AVERROR(ENOMEM);
00214 
00215             /* allocate the 3rd band buffer for scalability mode */
00216             if (cfg->luma_bands > 1) {
00217                 band->bufs[2] = av_malloc(buf_size);
00218                 if (!band->bufs[2])
00219                     return AVERROR(ENOMEM);
00220             }
00221 
00222             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
00223         }
00224     }
00225 
00226     return 0;
00227 }
00228 
00229 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
00230 {
00231     int p, b, t;
00232 
00233     for (p = 0; p < 3; p++) {
00234         for (b = 0; b < planes[p].num_bands; b++) {
00235             av_freep(&planes[p].bands[b].bufs[0]);
00236             av_freep(&planes[p].bands[b].bufs[1]);
00237             av_freep(&planes[p].bands[b].bufs[2]);
00238 
00239             if (planes[p].bands[b].blk_vlc.cust_tab.table)
00240                 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00241             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00242                 av_freep(&planes[p].bands[b].tiles[t].mbs);
00243             av_freep(&planes[p].bands[b].tiles);
00244         }
00245         av_freep(&planes[p].bands);
00246     }
00247 }
00248 
00249 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00250 {
00251     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00252     IVIBandDesc *band;
00253     IVITile     *tile, *ref_tile;
00254 
00255     for (p = 0; p < 3; p++) {
00256         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
00257         t_height = !p ? tile_height : (tile_height + 3) >> 2;
00258 
00259         if (!p && planes[0].num_bands == 4) {
00260             t_width  >>= 1;
00261             t_height >>= 1;
00262         }
00263 
00264         for (b = 0; b < planes[p].num_bands; b++) {
00265             band = &planes[p].bands[b];
00266             x_tiles = IVI_NUM_TILES(band->width, t_width);
00267             y_tiles = IVI_NUM_TILES(band->height, t_height);
00268             band->num_tiles = x_tiles * y_tiles;
00269 
00270             av_freep(&band->tiles);
00271             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00272             if (!band->tiles)
00273                 return AVERROR(ENOMEM);
00274 
00275             tile = band->tiles;
00276 
00277             /* use the first luma band as reference for motion vectors
00278              * and quant */
00279             ref_tile = planes[0].bands[0].tiles;
00280 
00281             for (y = 0; y < band->height; y += t_height) {
00282                 for (x = 0; x < band->width; x += t_width) {
00283                     tile->xpos     = x;
00284                     tile->ypos     = y;
00285                     tile->width    = FFMIN(band->width - x,  t_width);
00286                     tile->height   = FFMIN(band->height - y, t_height);
00287                     tile->is_empty = tile->data_size = 0;
00288                     /* calculate number of macroblocks */
00289                     tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
00290                                                       band->mb_size);
00291 
00292                     av_freep(&tile->mbs);
00293                     tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00294                     if (!tile->mbs)
00295                         return AVERROR(ENOMEM);
00296 
00297                     tile->ref_mbs = 0;
00298                     if (p || b) {
00299                         tile->ref_mbs = ref_tile->mbs;
00300                         ref_tile++;
00301                     }
00302 
00303                     tile++;
00304                 }
00305             }
00306 
00307         }// for b
00308     }// for p
00309 
00310     return 0;
00311 }
00312 
00313 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
00314 {
00315     int    len;
00316 
00317     len = 0;
00318     if (get_bits1(gb)) {
00319         len = get_bits(gb, 8);
00320         if (len == 255)
00321             len = get_bits_long(gb, 24);
00322     }
00323 
00324     /* align the bitstream reader on the byte boundary */
00325     align_get_bits(gb);
00326 
00327     return len;
00328 }
00329 
00330 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
00331 {
00332     int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00333                 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
00334     uint8_t     col_flags[8];
00335     int32_t     prev_dc, trvec[64];
00336     uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
00337     IVIMbInfo   *mb;
00338     RVMapDesc   *rvmap = band->rv_map;
00339     void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00340     void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00341     const uint16_t  *base_tab;
00342     const uint8_t   *scale_tab;
00343 
00344     prev_dc = 0; /* init intra prediction for the DC coefficient */
00345 
00346     blk_size   = band->blk_size;
00347     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
00348     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
00349     num_coeffs = blk_size * blk_size;
00350     if (blk_size == 8) {
00351         mc_with_delta_func = ff_ivi_mc_8x8_delta;
00352         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
00353     } else {
00354         mc_with_delta_func = ff_ivi_mc_4x4_delta;
00355         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
00356     }
00357 
00358     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00359         is_intra = !mb->type;
00360         cbp      = mb->cbp;
00361         buf_offs = mb->buf_offs;
00362 
00363         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00364 
00365         base_tab  = is_intra ? band->intra_base  : band->inter_base;
00366         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00367         if (scale_tab)
00368             quant = scale_tab[quant];
00369 
00370         if (!is_intra) {
00371             mv_x = mb->mv_x;
00372             mv_y = mb->mv_y;
00373             if (!band->is_halfpel) {
00374                 mc_type = 0; /* we have only fullpel vectors */
00375             } else {
00376                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00377                 mv_x >>= 1;
00378                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00379             }
00380         }
00381 
00382         for (blk = 0; blk < num_blocks; blk++) {
00383             /* adjust block position in the buffer according to its number */
00384             if (blk & 1) {
00385                 buf_offs += blk_size;
00386             } else if (blk == 2) {
00387                 buf_offs -= blk_size;
00388                 buf_offs += blk_size * band->pitch;
00389             }
00390 
00391             if (cbp & 1) { /* block coded ? */
00392                 scan_pos = -1;
00393                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
00394                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
00395 
00396                 while (scan_pos <= num_coeffs) {
00397                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00398                     if (sym == rvmap->eob_sym)
00399                         break; /* End of block */
00400 
00401                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
00402                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00403                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00404                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00405                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
00406                     } else {
00407                         if (sym >= 256U) {
00408                             av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00409                             return -1;
00410                         }
00411                         run = rvmap->runtab[sym];
00412                         val = rvmap->valtab[sym];
00413                     }
00414 
00415                     /* de-zigzag and dequantize */
00416                     scan_pos += run;
00417                     if (scan_pos >= num_coeffs)
00418                         break;
00419                     pos = band->scan[scan_pos];
00420 
00421                     if (!val)
00422                         av_dlog(NULL, "Val = 0 encountered!\n");
00423 
00424                     q = (base_tab[pos] * quant) >> 9;
00425                     if (q > 1)
00426                         val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00427                     trvec[pos] = val;
00428                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
00429                 }// while
00430 
00431                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00432                     return -1; /* corrupt block data */
00433 
00434                 /* undoing DC coeff prediction for intra-blocks */
00435                 if (is_intra && band->is_2d_trans) {
00436                     prev_dc      += trvec[0];
00437                     trvec[0]      = prev_dc;
00438                     col_flags[0] |= !!prev_dc;
00439                 }
00440 
00441                 /* apply inverse transform */
00442                 band->inv_transform(trvec, band->buf + buf_offs,
00443                                     band->pitch, col_flags);
00444 
00445                 /* apply motion compensation */
00446                 if (!is_intra)
00447                     mc_with_delta_func(band->buf + buf_offs,
00448                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00449                                        band->pitch, mc_type);
00450             } else {
00451                 /* block not coded */
00452                 /* for intra blocks apply the dc slant transform */
00453                 /* for inter - perform the motion compensation without delta */
00454                 if (is_intra && band->dc_transform) {
00455                     band->dc_transform(&prev_dc, band->buf + buf_offs,
00456                                        band->pitch, blk_size);
00457                 } else
00458                     mc_no_delta_func(band->buf + buf_offs,
00459                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00460                                      band->pitch, mc_type);
00461             }
00462 
00463             cbp >>= 1;
00464         }// for blk
00465     }// for mbn
00466 
00467     align_get_bits(gb);
00468 
00469     return 0;
00470 }
00471 
00472 int ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00473                                IVITile *tile, int32_t mv_scale)
00474 {
00475     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00476     int             offs, mb_offset, row_offset;
00477     IVIMbInfo       *mb, *ref_mb;
00478     const int16_t   *src;
00479     int16_t         *dst;
00480     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00481                              int mc_type);
00482 
00483     if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
00484         av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
00485                "parameters %d in ivi_process_empty_tile()\n",
00486                tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00487         return AVERROR_INVALIDDATA;
00488     }
00489 
00490     offs       = tile->ypos * band->pitch + tile->xpos;
00491     mb         = tile->mbs;
00492     ref_mb     = tile->ref_mbs;
00493     row_offset = band->mb_size * band->pitch;
00494     need_mc    = 0; /* reset the mc tracking flag */
00495 
00496     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00497         mb_offset = offs;
00498 
00499         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00500             mb->xpos     = x;
00501             mb->ypos     = y;
00502             mb->buf_offs = mb_offset;
00503 
00504             mb->type = 1; /* set the macroblocks type = INTER */
00505             mb->cbp  = 0; /* all blocks are empty */
00506 
00507             if (!band->qdelta_present && !band->plane && !band->band_num) {
00508                 mb->q_delta = band->glob_quant;
00509                 mb->mv_x    = 0;
00510                 mb->mv_y    = 0;
00511             }
00512 
00513             if (band->inherit_qdelta && ref_mb)
00514                 mb->q_delta = ref_mb->q_delta;
00515 
00516             if (band->inherit_mv) {
00517                 /* motion vector inheritance */
00518                 if (mv_scale) {
00519                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00520                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00521                 } else {
00522                     mb->mv_x = ref_mb->mv_x;
00523                     mb->mv_y = ref_mb->mv_y;
00524                 }
00525                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
00526             }
00527 
00528             mb++;
00529             if (ref_mb)
00530                 ref_mb++;
00531             mb_offset += band->mb_size;
00532         } // for x
00533         offs += row_offset;
00534     } // for y
00535 
00536     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
00537         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
00538         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00539                                                  : ff_ivi_mc_4x4_no_delta;
00540 
00541         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00542             mv_x = mb->mv_x;
00543             mv_y = mb->mv_y;
00544             if (!band->is_halfpel) {
00545                 mc_type = 0; /* we have only fullpel vectors */
00546             } else {
00547                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00548                 mv_x >>= 1;
00549                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00550             }
00551 
00552             for (blk = 0; blk < num_blocks; blk++) {
00553                 /* adjust block position in the buffer according with its number */
00554                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00555                 mc_no_delta_func(band->buf + offs,
00556                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
00557                                  band->pitch, mc_type);
00558             }
00559         }
00560     } else {
00561         /* copy data from the reference tile into the current one */
00562         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00563         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
00564         for (y = 0; y < tile->height; y++) {
00565             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00566             src += band->pitch;
00567             dst += band->pitch;
00568         }
00569     }
00570 
00571     return 0;
00572 }
00573 
00574 
00575 #ifdef DEBUG
00576 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00577 {
00578     int         x, y;
00579     int16_t     *src, checksum;
00580 
00581     src = band->buf;
00582     checksum = 0;
00583 
00584     for (y = 0; y < band->height; src += band->pitch, y++)
00585         for (x = 0; x < band->width; x++)
00586             checksum += src[x];
00587 
00588     return checksum;
00589 }
00590 
00591 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00592 {
00593     int         x, y, result;
00594     uint8_t     t1, t2;
00595     int16_t    *src;
00596 
00597     src = band->buf;
00598     result = 0;
00599 
00600     for (y = 0; y < band->height; src += band->pitch, y++) {
00601         for (x = 0; x < band->width; x++) {
00602             t1 = av_clip(src[x] + 128, 0, 255);
00603             t2 = ref[x];
00604             if (t1 != t2) {
00605                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00606                        y / band->blk_size, x / band->blk_size);
00607                 result = -1;
00608             }
00609         }
00610         ref += pitch;
00611     }
00612 
00613     return result;
00614 }
00615 #endif
00616 
00617 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00618 {
00619     int             x, y;
00620     const int16_t   *src  = plane->bands[0].buf;
00621     uint32_t        pitch = plane->bands[0].pitch;
00622 
00623     for (y = 0; y < plane->height; y++) {
00624         for (x = 0; x < plane->width; x++)
00625             dst[x] = av_clip_uint8(src[x] + 128);
00626         src += pitch;
00627         dst += dst_pitch;
00628     }
00629 }
00630 
00631 
00638 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00639     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
00640     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00641     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00642     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00643     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00644     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00645     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00646     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00647 };
00648 
00649 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00650     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00651     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00652     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00653     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00654     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00655     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00656     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00657     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00658 };
00659 
00660 
00664 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00665     0,  8, 16, 24, 32, 40, 48, 56,
00666     1,  9, 17, 25, 33, 41, 49, 57,
00667     2, 10, 18, 26, 34, 42, 50, 58,
00668     3, 11, 19, 27, 35, 43, 51, 59,
00669     4, 12, 20, 28, 36, 44, 52, 60,
00670     5, 13, 21, 29, 37, 45, 53, 61,
00671     6, 14, 22, 30, 38, 46, 54, 62,
00672     7, 15, 23, 31, 39, 47, 55, 63
00673 };
00674 
00675 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00676      0,  1,  2,  3,  4,  5,  6,  7,
00677      8,  9, 10, 11, 12, 13, 14, 15,
00678     16, 17, 18, 19, 20, 21, 22, 23,
00679     24, 25, 26, 27, 28, 29, 30, 31,
00680     32, 33, 34, 35, 36, 37, 38, 39,
00681     40, 41, 42, 43, 44, 45, 46, 47,
00682     48, 49, 50, 51, 52, 53, 54, 55,
00683     56, 57, 58, 59, 60, 61, 62, 63
00684 };
00685 
00686 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00687     0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00688 };
00689 
00690 
00694 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00695 {   /* MapTab0 */
00696     5, /* eob_sym */
00697     2, /* esc_sym */
00698     /* run table */
00699     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
00700      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
00701      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
00702      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
00703      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
00704      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
00705      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
00706      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
00707      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
00708      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
00709     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
00710      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
00711      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
00712      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
00713      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
00714     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00715 
00716     /* value table */
00717     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
00718       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
00719      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
00720       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
00721      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
00722       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
00723       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
00724       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
00725      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
00726       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
00727      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
00728       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
00729     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
00730      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
00731       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
00732      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
00733 },{
00734     /* MapTab1 */
00735     0,  /* eob_sym */
00736     38, /* esc_sym */
00737     /* run table */
00738     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
00739      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
00740     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00741     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
00742     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
00743     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
00744     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
00745     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
00746     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
00747     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
00748     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
00749      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
00750     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
00751     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
00752     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
00753      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
00754 
00755     /* value table */
00756     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
00757     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
00758     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
00759      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
00760      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
00761      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
00762     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
00763     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
00764      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
00765      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
00766      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
00767      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
00768      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
00769      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
00770     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
00771     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
00772 },{
00773     /* MapTab2 */
00774     2,  /* eob_sym */
00775     11, /* esc_sym */
00776     /* run table */
00777     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
00778      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
00779      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
00780      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
00781      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
00782      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
00783     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
00784     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
00785     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
00786      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
00787      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
00788     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
00789     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
00790     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
00791      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
00792      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
00793 
00794     /* value table */
00795     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
00796       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
00797      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
00798       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
00799       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
00800       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
00801       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
00802       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
00803       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
00804      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
00805     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
00806      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
00807       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
00808      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
00809      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
00810      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
00811 },{
00812     /* MapTab3 */
00813     0,  /* eob_sym */
00814     35, /* esc_sym */
00815     /* run table */
00816     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
00817      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
00818      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
00819      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
00820     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
00821      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
00822      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
00823     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
00824     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
00825     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
00826     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
00827      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
00828     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
00829     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
00830     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
00831     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
00832 
00833     /* value table */
00834     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
00835      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
00836      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
00837       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
00838       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
00839       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
00840       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
00841      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
00842       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
00843       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
00844      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
00845      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
00846      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
00847       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
00848      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
00849      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
00850 },{
00851     /* MapTab4 */
00852     0,  /* eob_sym */
00853     34, /* esc_sym */
00854     /* run table */
00855     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
00856      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
00857      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
00858      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
00859      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
00860      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
00861      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
00862      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
00863      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
00864      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
00865      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
00866      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
00867      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
00868      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
00869      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
00870      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
00871 
00872     /* value table */
00873     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
00874       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
00875       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
00876       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
00877      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
00878      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
00879       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
00880       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
00881       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
00882     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
00883     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
00884      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
00885     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
00886       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
00887      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
00888      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
00889 },{
00890     /* MapTab5 */
00891     2,  /* eob_sym */
00892     33, /* esc_sym */
00893     /* run table */
00894     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
00895      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
00896      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
00897     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
00898      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
00899      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
00900      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
00901      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
00902      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
00903      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
00904      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
00905      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
00906      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
00907     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
00908      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
00909     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
00910 
00911     /* value table */
00912     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
00913      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
00914      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
00915       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
00916       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
00917       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
00918      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
00919      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
00920     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
00921      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
00922      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
00923       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
00924      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
00925      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
00926      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
00927      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
00928 },{
00929     /* MapTab6 */
00930     2,  /* eob_sym */
00931     13, /* esc_sym */
00932     /* run table */
00933     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
00934      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
00935      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
00936      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
00937      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
00938      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
00939     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
00940      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
00941     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
00942      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
00943      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
00944      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
00945      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
00946     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
00947      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
00948     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
00949 
00950     /* value table */
00951     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
00952        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
00953        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
00954        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
00955      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
00956        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
00957       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
00958       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
00959        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
00960       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
00961       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
00962      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
00963       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
00964       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
00965        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
00966        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
00967 },{
00968     /* MapTab7 */
00969     2,  /* eob_sym */
00970     38, /* esc_sym */
00971     /* run table */
00972     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
00973      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
00974      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
00975     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
00976      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
00977     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
00978     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
00979     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
00980     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
00981     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
00982      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
00983     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
00984      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
00985      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
00986      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
00987     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
00988 
00989     /* value table */
00990     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
00991      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
00992      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
00993       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
00994       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
00995      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
00996      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
00997       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
00998      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
00999      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
01000      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
01001      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
01002      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
01003      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
01004       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
01005       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
01006 },{
01007     /* MapTab8 */
01008     4,  /* eob_sym */
01009     11, /* esc_sym */
01010     /* run table */
01011     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
01012      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
01013      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
01014      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
01015      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
01016      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
01017      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
01018     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
01019      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
01020      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
01021      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
01022     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
01023     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
01024      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
01025     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
01026     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
01027 
01028     /* value table */
01029     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
01030       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
01031       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
01032       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
01033      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
01034       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
01035      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
01036       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
01037     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
01038      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
01039       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
01040       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
01041      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
01042       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
01043       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
01044       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
01045 }
01046 };