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