• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • 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 FFmpeg.
00007  *
00008  * FFmpeg is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * FFmpeg is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with FFmpeg; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  */
00022 
00029 #define 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 uint8_t   *base_tab, *scale_tab;
00342 
00343     prev_dc = 0; /* init intra prediction for the DC coefficient */
00344 
00345     blk_size   = band->blk_size;
00346     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
00347     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
00348     num_coeffs = blk_size * blk_size;
00349     if (blk_size == 8) {
00350         mc_with_delta_func = ff_ivi_mc_8x8_delta;
00351         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
00352     } else {
00353         mc_with_delta_func = ff_ivi_mc_4x4_delta;
00354         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
00355     }
00356 
00357     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00358         is_intra = !mb->type;
00359         cbp      = mb->cbp;
00360         buf_offs = mb->buf_offs;
00361 
00362         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00363 
00364         base_tab  = is_intra ? band->intra_base  : band->inter_base;
00365         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00366 
00367         if (!is_intra) {
00368             mv_x = mb->mv_x;
00369             mv_y = mb->mv_y;
00370             if (!band->is_halfpel) {
00371                 mc_type = 0; /* we have only fullpel vectors */
00372             } else {
00373                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00374                 mv_x >>= 1;
00375                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00376             }
00377         }
00378 
00379         for (blk = 0; blk < num_blocks; blk++) {
00380             /* adjust block position in the buffer according to its number */
00381             if (blk & 1) {
00382                 buf_offs += blk_size;
00383             } else if (blk == 2) {
00384                 buf_offs -= blk_size;
00385                 buf_offs += blk_size * band->pitch;
00386             }
00387 
00388             if (cbp & 1) { /* block coded ? */
00389                 scan_pos = -1;
00390                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
00391                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
00392 
00393                 while (scan_pos <= num_coeffs) {
00394                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00395                     if (sym == rvmap->eob_sym)
00396                         break; /* End of block */
00397 
00398                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
00399                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00400                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00401                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00402                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
00403                     } else {
00404                         run = rvmap->runtab[sym];
00405                         val = rvmap->valtab[sym];
00406                     }
00407 
00408                     /* de-zigzag and dequantize */
00409                     scan_pos += run;
00410                     if (scan_pos >= num_coeffs)
00411                         break;
00412                     pos = band->scan[scan_pos];
00413 
00414                     if (IVI_DEBUG && !val)
00415                         av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
00416 
00417                     q = (base_tab[pos] * scale_tab[quant]) >> 8;
00418                     if (q > 1)
00419                         val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
00420                     trvec[pos] = val;
00421                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
00422                 }// while
00423 
00424                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00425                     return -1; /* corrupt block data */
00426 
00427                 /* undoing DC coeff prediction for intra-blocks */
00428                 if (is_intra && band->is_2d_trans) {
00429                     prev_dc      += trvec[0];
00430                     trvec[0]      = prev_dc;
00431                     col_flags[0] |= !!prev_dc;
00432                 }
00433 
00434                 /* apply inverse transform */
00435                 band->inv_transform(trvec, band->buf + buf_offs,
00436                                     band->pitch, col_flags);
00437 
00438                 /* apply motion compensation */
00439                 if (!is_intra)
00440                     mc_with_delta_func(band->buf + buf_offs,
00441                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00442                                        band->pitch, mc_type);
00443             } else {
00444                 /* block not coded */
00445                 /* for intra blocks apply the dc slant transform */
00446                 /* for inter - perform the motion compensation without delta */
00447                 if (is_intra && band->dc_transform) {
00448                     band->dc_transform(&prev_dc, band->buf + buf_offs,
00449                                        band->pitch, blk_size);
00450                 } else
00451                     mc_no_delta_func(band->buf + buf_offs,
00452                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00453                                      band->pitch, mc_type);
00454             }
00455 
00456             cbp >>= 1;
00457         }// for blk
00458     }// for mbn
00459 
00460     align_get_bits(gb);
00461 
00462     return 0;
00463 }
00464 
00465 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00466                                IVITile *tile, int32_t mv_scale)
00467 {
00468     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00469     int             offs, mb_offset, row_offset;
00470     IVIMbInfo       *mb, *ref_mb;
00471     const int16_t   *src;
00472     int16_t         *dst;
00473     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00474                              int mc_type);
00475 
00476     offs       = tile->ypos * band->pitch + tile->xpos;
00477     mb         = tile->mbs;
00478     ref_mb     = tile->ref_mbs;
00479     row_offset = band->mb_size * band->pitch;
00480     need_mc    = 0; /* reset the mc tracking flag */
00481 
00482     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00483         mb_offset = offs;
00484 
00485         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00486             mb->xpos     = x;
00487             mb->ypos     = y;
00488             mb->buf_offs = mb_offset;
00489 
00490             mb->type = 1; /* set the macroblocks type = INTER */
00491             mb->cbp  = 0; /* all blocks are empty */
00492 
00493             if (!band->qdelta_present && !band->plane && !band->band_num) {
00494                 mb->q_delta = band->glob_quant;
00495                 mb->mv_x    = 0;
00496                 mb->mv_y    = 0;
00497             }
00498 
00499             if (band->inherit_qdelta && ref_mb)
00500                 mb->q_delta = ref_mb->q_delta;
00501 
00502             if (band->inherit_mv) {
00503                 /* motion vector inheritance */
00504                 if (mv_scale) {
00505                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00506                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00507                 } else {
00508                     mb->mv_x = ref_mb->mv_x;
00509                     mb->mv_y = ref_mb->mv_y;
00510                 }
00511                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
00512             }
00513 
00514             mb++;
00515             if (ref_mb)
00516                 ref_mb++;
00517             mb_offset += band->mb_size;
00518         } // for x
00519         offs += row_offset;
00520     } // for y
00521 
00522     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
00523         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
00524         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00525                                                  : ff_ivi_mc_4x4_no_delta;
00526 
00527         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00528             mv_x = mb->mv_x;
00529             mv_y = mb->mv_y;
00530             if (!band->is_halfpel) {
00531                 mc_type = 0; /* we have only fullpel vectors */
00532             } else {
00533                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00534                 mv_x >>= 1;
00535                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
00536             }
00537 
00538             for (blk = 0; blk < num_blocks; blk++) {
00539                 /* adjust block position in the buffer according with its number */
00540                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00541                 mc_no_delta_func(band->buf + offs,
00542                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
00543                                  band->pitch, mc_type);
00544             }
00545         }
00546     } else {
00547         /* copy data from the reference tile into the current one */
00548         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00549         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
00550         for (y = 0; y < tile->height; y++) {
00551             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00552             src += band->pitch;
00553             dst += band->pitch;
00554         }
00555     }
00556 }
00557 
00558 
00559 #if IVI_DEBUG
00560 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
00561 {
00562     int         x, y;
00563     int16_t     *src, checksum;
00564 
00565     src = band->buf;
00566     checksum = 0;
00567 
00568     for (y = 0; y < band->height; src += band->pitch, y++)
00569         for (x = 0; x < band->width; x++)
00570             checksum += src[x];
00571 
00572     return checksum;
00573 }
00574 
00575 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
00576 {
00577     int         x, y, result;
00578     uint8_t     t1, t2;
00579     int16_t    *src;
00580 
00581     src = band->buf;
00582     result = 0;
00583 
00584     for (y = 0; y < band->height; src += band->pitch, y++) {
00585         for (x = 0; x < band->width; x++) {
00586             t1 = av_clip(src[x] + 128, 0, 255);
00587             t2 = ref[x];
00588             if (t1 != t2) {
00589                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
00590                        y / band->blk_size, x / band->blk_size);
00591                 result = -1;
00592             }
00593         }
00594         ref += pitch;
00595     }
00596 
00597     return result;
00598 }
00599 #endif
00600 
00601 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00602 {
00603     int             x, y;
00604     const int16_t   *src  = plane->bands[0].buf;
00605     uint32_t        pitch = plane->bands[0].pitch;
00606 
00607     for (y = 0; y < plane->height; y++) {
00608         for (x = 0; x < plane->width; x++)
00609             dst[x] = av_clip_uint8(src[x] + 128);
00610         src += pitch;
00611         dst += dst_pitch;
00612     }
00613 }
00614 
00615 
00622 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00623     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
00624     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00625     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00626     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00627     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00628     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00629     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00630     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00631 };
00632 
00633 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00634     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00635     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00636     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00637     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00638     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00639     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00640     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00641     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00642 };
00643 
00644 
00648 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
00649 {   /* MapTab0 */
00650     5, /* eob_sym */
00651     2, /* esc_sym */
00652     /* run table */
00653     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
00654      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
00655      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
00656      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
00657      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
00658      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
00659      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
00660      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
00661      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
00662      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
00663     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
00664      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
00665      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
00666      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
00667      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
00668     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
00669 
00670     /* value table */
00671     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
00672       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
00673      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
00674       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
00675      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
00676       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
00677       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
00678       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
00679      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
00680       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
00681      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
00682       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
00683     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
00684      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
00685       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
00686      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
00687 },{
00688     /* MapTab1 */
00689     0,  /* eob_sym */
00690     38, /* esc_sym */
00691     /* run table */
00692     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
00693      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
00694     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
00695     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
00696     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
00697     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
00698     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
00699     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
00700     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
00701     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
00702     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
00703      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
00704     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
00705     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
00706     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
00707      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
00708 
00709     /* value table */
00710     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
00711     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
00712     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
00713      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
00714      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
00715      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
00716     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
00717     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
00718      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
00719      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
00720      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
00721      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
00722      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
00723      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
00724     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
00725     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
00726 },{
00727     /* MapTab2 */
00728     2,  /* eob_sym */
00729     11, /* esc_sym */
00730     /* run table */
00731     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
00732      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
00733      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
00734      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
00735      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
00736      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
00737     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
00738     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
00739     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
00740      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
00741      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
00742     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
00743     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
00744     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
00745      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
00746      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
00747 
00748     /* value table */
00749     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
00750       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
00751      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
00752       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
00753       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
00754       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
00755       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
00756       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
00757       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
00758      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
00759     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
00760      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
00761       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
00762      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
00763      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
00764      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
00765 },{
00766     /* MapTab3 */
00767     0,  /* eob_sym */
00768     35, /* esc_sym */
00769     /* run table */
00770     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
00771      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
00772      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
00773      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
00774     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
00775      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
00776      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
00777     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
00778     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
00779     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
00780     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
00781      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
00782     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
00783     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
00784     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
00785     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
00786 
00787     /* value table */
00788     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
00789      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
00790      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
00791       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
00792       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
00793       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
00794       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
00795      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
00796       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
00797       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
00798      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
00799      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
00800      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
00801       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
00802      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
00803      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
00804 },{
00805     /* MapTab4 */
00806     0,  /* eob_sym */
00807     34, /* esc_sym */
00808     /* run table */
00809     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
00810      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
00811      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
00812      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
00813      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
00814      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
00815      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
00816      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
00817      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
00818      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
00819      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
00820      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
00821      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
00822      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
00823      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
00824      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
00825 
00826     /* value table */
00827     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
00828       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
00829       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
00830       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
00831      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
00832      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
00833       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
00834       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
00835       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
00836     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
00837     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
00838      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
00839     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
00840       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
00841      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
00842      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
00843 },{
00844     /* MapTab5 */
00845     2,  /* eob_sym */
00846     33, /* esc_sym */
00847     /* run table */
00848     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
00849      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
00850      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
00851     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
00852      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
00853      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
00854      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
00855      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
00856      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
00857      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
00858      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
00859      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
00860      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
00861     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
00862      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
00863     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
00864 
00865     /* value table */
00866     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
00867      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
00868      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
00869       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
00870       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
00871       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
00872      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
00873      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
00874     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
00875      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
00876      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
00877       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
00878      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
00879      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
00880      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
00881      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
00882 },{
00883     /* MapTab6 */
00884     2,  /* eob_sym */
00885     13, /* esc_sym */
00886     /* run table */
00887     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
00888      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
00889      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
00890      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
00891      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
00892      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
00893     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
00894      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
00895     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
00896      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
00897      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
00898      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
00899      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
00900     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
00901      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
00902     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
00903 
00904     /* value table */
00905     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
00906        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
00907        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
00908        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
00909      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
00910        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
00911       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
00912       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
00913        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
00914       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
00915       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
00916      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
00917       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
00918       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
00919        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
00920        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
00921 },{
00922     /* MapTab7 */
00923     2,  /* eob_sym */
00924     38, /* esc_sym */
00925     /* run table */
00926     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
00927      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
00928      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
00929     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
00930      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
00931     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
00932     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
00933     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
00934     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
00935     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
00936      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
00937     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
00938      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
00939      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
00940      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
00941     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
00942 
00943     /* value table */
00944     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
00945      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
00946      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
00947       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
00948       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
00949      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
00950      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
00951       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
00952      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
00953      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
00954      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
00955      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
00956      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
00957      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
00958       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
00959       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
00960 },{
00961     /* MapTab8 */
00962     4,  /* eob_sym */
00963     11, /* esc_sym */
00964     /* run table */
00965     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
00966      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
00967      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
00968      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
00969      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
00970      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
00971      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
00972     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
00973      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
00974      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
00975      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
00976     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
00977     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
00978      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
00979     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
00980     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
00981 
00982     /* value table */
00983     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
00984       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
00985       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
00986       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
00987      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
00988       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
00989      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
00990       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
00991     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
00992      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
00993       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
00994       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
00995      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
00996       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
00997       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
00998       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
00999 }
01000 };

Generated on Fri Sep 16 2011 17:17:38 for FFmpeg by  doxygen 1.7.1