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

Generated on Fri Feb 22 2013 07:24:27 for FFmpeg by  doxygen 1.7.1