• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

libavcodec/ivi_common.c

Go to the documentation of this file.
00001 /*
00002  * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
00003  *
00004  * Copyright (c) 2009 Maxim Poliakovski
00005  *
00006  * This file is part of Libav.
00007  *
00008  * Libav is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * Libav is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with Libav; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  */
00022 
00029 #define BITSTREAM_READER_LE
00030 #include "avcodec.h"
00031 #include "get_bits.h"
00032 #include "ivi_common.h"
00033 #include "libavutil/common.h"
00034 #include "ivi_dsp.h"
00035 
00036 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  
00037 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; 
00038 
00039 VLC ff_ivi_mb_vlc_tabs [8];
00040 VLC ff_ivi_blk_vlc_tabs[8];
00041 
00046 static uint16_t inv_bits(uint16_t val, int nbits)
00047 {
00048     uint16_t res;
00049 
00050     if (nbits <= 8) {
00051         res = av_reverse[val] >> (8-nbits);
00052     } else
00053         res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
00054 
00055     return res;
00056 }
00057 
00058 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
00059 {
00060     int         pos, i, j, codes_per_row, prefix, not_last_row;
00061     uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
00062     uint8_t     bits[256];
00063 
00064     pos = 0; /* current position = 0 */
00065 
00066     for (i = 0; i < cb->num_rows; i++) {
00067         codes_per_row = 1 << cb->xbits[i];
00068         not_last_row  = (i != cb->num_rows - 1);
00069         prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
00070 
00071         for (j = 0; j < codes_per_row; j++) {
00072             if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
00073                 break;      /* elements, but only 256 codes are allowed! */
00074 
00075             bits[pos] = i + cb->xbits[i] + not_last_row;
00076             if (bits[pos] > IVI_VLC_BITS)
00077                 return -1; /* invalid descriptor */
00078 
00079             codewords[pos] = inv_bits((prefix | j), bits[pos]);
00080             if (!bits[pos])
00081                 bits[pos] = 1;
00082 
00083             pos++;
00084         }//for j
00085     }//for i
00086 
00087     /* number of codewords = pos */
00088     return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
00089                     (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
00090 }
00091 
00092 void ff_ivi_init_static_vlc(void)
00093 {
00094     int i;
00095     static VLC_TYPE table_data[8192 * 16][2];
00096     static int initialized_vlcs = 0;
00097 
00098     if (initialized_vlcs)
00099         return;
00100     for (i = 0; i < 8; i++) {
00101         ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
00102         ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
00103         ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],  &ff_ivi_mb_vlc_tabs[i],  1);
00104         ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
00105         ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
00106         ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
00107     }
00108     initialized_vlcs = 1;
00109 }
00110 
00111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
00112                          IVIHuffTab *huff_tab, AVCodecContext *avctx)
00113 {
00114     int         i, result;
00115     IVIHuffDesc new_huff;
00116 
00117     if (!desc_coded) {
00118         /* select default table */
00119         huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
00120             : &ff_ivi_mb_vlc_tabs [7];
00121     } else {
00122         huff_tab->tab_sel = get_bits(gb, 3);
00123         if (huff_tab->tab_sel == 7) {
00124             /* custom huffman table (explicitly encoded) */
00125             new_huff.num_rows = get_bits(gb, 4);
00126 
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 void 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     offs       = tile->ypos * band->pitch + tile->xpos;
00484     mb         = tile->mbs;
00485     ref_mb     = tile->ref_mbs;
00486     row_offset = band->mb_size * band->pitch;
00487     need_mc    = 0; /* reset the mc tracking flag */
00488 
00489     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00490         mb_offset = offs;
00491 
00492         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00493             mb->xpos     = x;
00494             mb->ypos     = y;
00495             mb->buf_offs = mb_offset;
00496 
00497             mb->type = 1; /* set the macroblocks type = INTER */
00498             mb->cbp  = 0; /* all blocks are empty */
00499 
00500             if (!band->qdelta_present && !band->plane && !band->band_num) {
00501                 mb->q_delta = band->glob_quant;
00502                 mb->mv_x    = 0;
00503                 mb->mv_y    = 0;
00504             }
00505 
00506             if (band->inherit_qdelta && ref_mb)
00507                 mb->q_delta = ref_mb->q_delta;
00508 
00509             if (band->inherit_mv) {
00510                 /* motion vector inheritance */
00511                 if (mv_scale) {
00512                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00513                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00514                 } else {
00515                     mb->mv_x = ref_mb->mv_x;
00516                     mb->mv_y = ref_mb->mv_y;
00517                 }
00518                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
00519             }
00520 
00521             mb++;
00522             if (ref_mb)
00523                 ref_mb++;
00524             mb_offset += band->mb_size;
00525         } // for x
00526         offs += row_offset;
00527     } // for y
00528 
00529     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
00530         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
00531         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00532                                                  : ff_ivi_mc_4x4_no_delta;
00533 
00534         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00535             mv_x = mb->mv_x;
00536             mv_y = mb->mv_y;
00537             if (!band->is_halfpel) {
00538                 mc_type = 0; /* we have only fullpel vectors */
00539             } else {
00540                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00541                 mv_x >>= 1;
00542                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00543             }
00544 
00545             for (blk = 0; blk < num_blocks; blk++) {
00546                 /* adjust block position in the buffer according with its number */
00547                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00548                 mc_no_delta_func(band->buf + offs,
00549                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
00550                                  band->pitch, mc_type);
00551             }
00552         }
00553     } else {
00554         /* copy data from the reference tile into the current one */
00555         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00556         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
00557         for (y = 0; y < tile->height; y++) {
00558             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00559             src += band->pitch;
00560             dst += band->pitch;
00561         }
00562     }
00563 }
00564 
00565 
00566 #ifdef DEBUG
00567 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00568 {
00569     int         x, y;
00570     int16_t     *src, checksum;
00571 
00572     src = band->buf;
00573     checksum = 0;
00574 
00575     for (y = 0; y < band->height; src += band->pitch, y++)
00576         for (x = 0; x < band->width; x++)
00577             checksum += src[x];
00578 
00579     return checksum;
00580 }
00581 
00582 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00583 {
00584     int         x, y, result;
00585     uint8_t     t1, t2;
00586     int16_t    *src;
00587 
00588     src = band->buf;
00589     result = 0;
00590 
00591     for (y = 0; y < band->height; src += band->pitch, y++) {
00592         for (x = 0; x < band->width; x++) {
00593             t1 = av_clip(src[x] + 128, 0, 255);
00594             t2 = ref[x];
00595             if (t1 != t2) {
00596                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00597                        y / band->blk_size, x / band->blk_size);
00598                 result = -1;
00599             }
00600         }
00601         ref += pitch;
00602     }
00603 
00604     return result;
00605 }
00606 #endif
00607 
00608 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00609 {
00610     int             x, y;
00611     const int16_t   *src  = plane->bands[0].buf;
00612     uint32_t        pitch = plane->bands[0].pitch;
00613 
00614     if (!src)
00615         return;
00616 
00617     for (y = 0; y < plane->height; y++) {
00618         for (x = 0; x < plane->width; x++)
00619             dst[x] = av_clip_uint8(src[x] + 128);
00620         src += pitch;
00621         dst += dst_pitch;
00622     }
00623 }
00624 
00625 
00632 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00633     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
00634     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00635     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00636     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00637     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00638     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00639     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00640     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00641 };
00642 
00643 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00644     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00645     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00646     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00647     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00648     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00649     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00650     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00651     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00652 };
00653 
00654 
00658 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
00659     0,  8, 16, 24, 32, 40, 48, 56,
00660     1,  9, 17, 25, 33, 41, 49, 57,
00661     2, 10, 18, 26, 34, 42, 50, 58,
00662     3, 11, 19, 27, 35, 43, 51, 59,
00663     4, 12, 20, 28, 36, 44, 52, 60,
00664     5, 13, 21, 29, 37, 45, 53, 61,
00665     6, 14, 22, 30, 38, 46, 54, 62,
00666     7, 15, 23, 31, 39, 47, 55, 63
00667 };
00668 
00669 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
00670      0,  1,  2,  3,  4,  5,  6,  7,
00671      8,  9, 10, 11, 12, 13, 14, 15,
00672     16, 17, 18, 19, 20, 21, 22, 23,
00673     24, 25, 26, 27, 28, 29, 30, 31,
00674     32, 33, 34, 35, 36, 37, 38, 39,
00675     40, 41, 42, 43, 44, 45, 46, 47,
00676     48, 49, 50, 51, 52, 53, 54, 55,
00677     56, 57, 58, 59, 60, 61, 62, 63
00678 };
00679 
00680 const uint8_t ff_ivi_direct_scan_4x4[16] = {
00681     0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
00682 };
00683 
00684 
00688 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00689 {   /* MapTab0 */
00690     5, /* eob_sym */
00691     2, /* esc_sym */
00692     /* run table */
00693     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
00694      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
00695      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
00696      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
00697      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
00698      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
00699      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
00700      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
00701      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
00702      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
00703     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
00704      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
00705      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
00706      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
00707      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
00708     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00709 
00710     /* value table */
00711     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
00712       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
00713      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
00714       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
00715      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
00716       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
00717       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
00718       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
00719      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
00720       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
00721      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
00722       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
00723     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
00724      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
00725       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
00726      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
00727 },{
00728     /* MapTab1 */
00729     0,  /* eob_sym */
00730     38, /* esc_sym */
00731     /* run table */
00732     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
00733      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
00734     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00735     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
00736     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
00737     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
00738     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
00739     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
00740     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
00741     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
00742     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
00743      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
00744     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
00745     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
00746     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
00747      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
00748 
00749     /* value table */
00750     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
00751     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
00752     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
00753      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
00754      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
00755      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
00756     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
00757     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
00758      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
00759      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
00760      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
00761      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
00762      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
00763      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
00764     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
00765     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
00766 },{
00767     /* MapTab2 */
00768     2,  /* eob_sym */
00769     11, /* esc_sym */
00770     /* run table */
00771     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
00772      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
00773      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
00774      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
00775      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
00776      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
00777     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
00778     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
00779     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
00780      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
00781      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
00782     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
00783     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
00784     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
00785      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
00786      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
00787 
00788     /* value table */
00789     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
00790       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
00791      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
00792       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
00793       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
00794       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
00795       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
00796       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
00797       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
00798      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
00799     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
00800      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
00801       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
00802      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
00803      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
00804      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
00805 },{
00806     /* MapTab3 */
00807     0,  /* eob_sym */
00808     35, /* esc_sym */
00809     /* run table */
00810     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
00811      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
00812      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
00813      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
00814     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
00815      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
00816      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
00817     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
00818     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
00819     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
00820     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
00821      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
00822     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
00823     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
00824     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
00825     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
00826 
00827     /* value table */
00828     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
00829      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
00830      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
00831       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
00832       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
00833       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
00834       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
00835      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
00836       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
00837       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
00838      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
00839      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
00840      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
00841       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
00842      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
00843      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
00844 },{
00845     /* MapTab4 */
00846     0,  /* eob_sym */
00847     34, /* esc_sym */
00848     /* run table */
00849     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
00850      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
00851      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
00852      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
00853      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
00854      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
00855      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
00856      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
00857      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
00858      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
00859      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
00860      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
00861      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
00862      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
00863      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
00864      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
00865 
00866     /* value table */
00867     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
00868       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
00869       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
00870       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
00871      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
00872      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
00873       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
00874       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
00875       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
00876     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
00877     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
00878      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
00879     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
00880       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
00881      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
00882      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
00883 },{
00884     /* MapTab5 */
00885     2,  /* eob_sym */
00886     33, /* esc_sym */
00887     /* run table */
00888     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
00889      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
00890      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
00891     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
00892      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
00893      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
00894      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
00895      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
00896      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
00897      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
00898      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
00899      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
00900      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
00901     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
00902      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
00903     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
00904 
00905     /* value table */
00906     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
00907      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
00908      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
00909       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
00910       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
00911       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
00912      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
00913      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
00914     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
00915      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
00916      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
00917       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
00918      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
00919      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
00920      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
00921      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
00922 },{
00923     /* MapTab6 */
00924     2,  /* eob_sym */
00925     13, /* esc_sym */
00926     /* run table */
00927     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
00928      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
00929      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
00930      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
00931      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
00932      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
00933     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
00934      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
00935     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
00936      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
00937      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
00938      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
00939      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
00940     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
00941      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
00942     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
00943 
00944     /* value table */
00945     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
00946        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
00947        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
00948        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
00949      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
00950        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
00951       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
00952       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
00953        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
00954       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
00955       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
00956      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
00957       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
00958       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
00959        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
00960        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
00961 },{
00962     /* MapTab7 */
00963     2,  /* eob_sym */
00964     38, /* esc_sym */
00965     /* run table */
00966     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
00967      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
00968      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
00969     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
00970      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
00971     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
00972     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
00973     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
00974     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
00975     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
00976      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
00977     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
00978      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
00979      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
00980      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
00981     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
00982 
00983     /* value table */
00984     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
00985      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
00986      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
00987       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
00988       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
00989      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
00990      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
00991       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
00992      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
00993      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
00994      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
00995      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
00996      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
00997      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
00998       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
00999       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
01000 },{
01001     /* MapTab8 */
01002     4,  /* eob_sym */
01003     11, /* esc_sym */
01004     /* run table */
01005     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
01006      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
01007      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
01008      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
01009      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
01010      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
01011      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
01012     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
01013      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
01014      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
01015      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
01016     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
01017     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
01018      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
01019     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
01020     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
01021 
01022     /* value table */
01023     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
01024       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
01025       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
01026       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
01027      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
01028       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
01029      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
01030       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
01031     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
01032      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
01033       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
01034       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
01035      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
01036       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
01037       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
01038       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
01039 }
01040 };
Generated on Sun Apr 22 2012 21:54:01 for Libav by doxygen 1.7.1