Tizen 2.1 base
[profile/ivi/gst-ffmpeg0.10.git] / gst-libs / ext / ffmpeg / libavcodec / ivi_common.c
1 /*
2  * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
3  *
4  * Copyright (c) 2009 Maxim Poliakovski
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file
25  * This file contains functions and data shared by both Indeo4 and
26  * Indeo5 decoders.
27  */
28
29 #define ALT_BITSTREAM_READER_LE
30 #include "avcodec.h"
31 #include "get_bits.h"
32 #include "ivi_common.h"
33 #include "libavutil/common.h"
34 #include "ivi_dsp.h"
35
36 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];  ///< static macroblock huffman tables
37 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
38
39 VLC ff_ivi_mb_vlc_tabs [8];
40 VLC ff_ivi_blk_vlc_tabs[8];
41
42 /**
43  *  Reverses "nbits" bits of the value "val" and returns the result
44  *  in the least significant bits.
45  */
46 static uint16_t inv_bits(uint16_t val, int nbits)
47 {
48     uint16_t res;
49
50     if (nbits <= 8) {
51         res = av_reverse[val] >> (8-nbits);
52     } else
53         res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits);
54
55     return res;
56 }
57
58 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
59 {
60     int         pos, i, j, codes_per_row, prefix, not_last_row;
61     uint16_t    codewords[256]; /* FIXME: move this temporal storage out? */
62     uint8_t     bits[256];
63
64     pos = 0; /* current position = 0 */
65
66     for (i = 0; i < cb->num_rows; i++) {
67         codes_per_row = 1 << cb->xbits[i];
68         not_last_row  = (i != cb->num_rows - 1);
69         prefix        = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
70
71         for (j = 0; j < codes_per_row; j++) {
72             if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
73                 break;      /* elements, but only 256 codes are allowed! */
74
75             bits[pos] = i + cb->xbits[i] + not_last_row;
76             if (bits[pos] > IVI_VLC_BITS)
77                 return -1; /* invalid descriptor */
78
79             codewords[pos] = inv_bits((prefix | j), bits[pos]);
80             if (!bits[pos])
81                 bits[pos] = 1;
82
83             pos++;
84         }//for j
85     }//for i
86
87     /* number of codewords = pos */
88     return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
89                     (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
90 }
91
92 void ff_ivi_init_static_vlc(void)
93 {
94     int i;
95     static VLC_TYPE table_data[8192 * 16][2];
96     static int initialized_vlcs = 0;
97
98     if (initialized_vlcs)
99         return;
100     for (i = 0; i < 8; i++) {
101         ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
102         ff_ivi_mb_vlc_tabs[i].table_allocated = 8192;
103         ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i],  &ff_ivi_mb_vlc_tabs[i],  1);
104         ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
105         ff_ivi_blk_vlc_tabs[i].table_allocated = 8192;
106         ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1);
107     }
108     initialized_vlcs = 1;
109 }
110
111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
112                          IVIHuffTab *huff_tab, AVCodecContext *avctx)
113 {
114     int         i, result;
115     IVIHuffDesc new_huff;
116
117     if (!desc_coded) {
118         /* select default table */
119         huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7]
120             : &ff_ivi_mb_vlc_tabs [7];
121     } else {
122         huff_tab->tab_sel = get_bits(gb, 3);
123         if (huff_tab->tab_sel == 7) {
124             /* custom huffman table (explicitly encoded) */
125             new_huff.num_rows = get_bits(gb, 4);
126
127             for (i = 0; i < new_huff.num_rows; i++)
128                 new_huff.xbits[i] = get_bits(gb, 4);
129
130             /* Have we got the same custom table? Rebuild if not. */
131             if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) {
132                 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
133
134                 if (huff_tab->cust_tab.table)
135                     free_vlc(&huff_tab->cust_tab);
136                 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc,
137                         &huff_tab->cust_tab, 0);
138                 if (result) {
139                     av_log(avctx, AV_LOG_ERROR,
140                            "Error while initializing custom vlc table!\n");
141                     return -1;
142                 }
143             }
144             huff_tab->tab = &huff_tab->cust_tab;
145         } else {
146             /* select one of predefined tables */
147             huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel]
148                 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel];
149         }
150     }
151
152     return 0;
153 }
154
155 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
156 {
157     return    desc1->num_rows != desc2->num_rows
158            || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
159 }
160
161 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
162 {
163     dst->num_rows = src->num_rows;
164     memcpy(dst->xbits, src->xbits, src->num_rows);
165 }
166
167 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
168 {
169     int         p, b;
170     uint32_t    b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
171     IVIBandDesc *band;
172
173     ff_ivi_free_buffers(planes);
174
175     /* fill in the descriptor of the luminance plane */
176     planes[0].width     = cfg->pic_width;
177     planes[0].height    = cfg->pic_height;
178     planes[0].num_bands = cfg->luma_bands;
179
180     /* fill in the descriptors of the chrominance planes */
181     planes[1].width     = planes[2].width     = (cfg->pic_width  + 3) >> 2;
182     planes[1].height    = planes[2].height    = (cfg->pic_height + 3) >> 2;
183     planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
184
185     for (p = 0; p < 3; p++) {
186         planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
187         if (!planes[p].bands)
188             return AVERROR(ENOMEM);
189
190         /* select band dimensions: if there is only one band then it
191          *  has the full size, if there are several bands each of them
192          *  has only half size */
193         b_width  = planes[p].num_bands == 1 ? planes[p].width  : (planes[p].width  + 1) >> 1;
194         b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
195
196         /* luma   band buffers will be aligned on 16x16 (max macroblock size) */
197         /* chroma band buffers will be aligned on   8x8 (max macroblock size) */
198         align_fac       = p ? 8 : 16;
199         width_aligned   = FFALIGN(b_width , align_fac);
200         height_aligned  = FFALIGN(b_height, align_fac);
201         buf_size        = width_aligned * height_aligned * sizeof(int16_t);
202
203         for (b = 0; b < planes[p].num_bands; b++) {
204             band = &planes[p].bands[b]; /* select appropriate plane/band */
205             band->plane    = p;
206             band->band_num = b;
207             band->width    = b_width;
208             band->height   = b_height;
209             band->pitch    = width_aligned;
210             band->bufs[0]  = av_malloc(buf_size);
211             band->bufs[1]  = av_malloc(buf_size);
212             if (!band->bufs[0] || !band->bufs[1])
213                 return AVERROR(ENOMEM);
214
215             /* allocate the 3rd band buffer for scalability mode */
216             if (cfg->luma_bands > 1) {
217                 band->bufs[2] = av_malloc(buf_size);
218                 if (!band->bufs[2])
219                     return AVERROR(ENOMEM);
220             }
221
222             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
223         }
224     }
225
226     return 0;
227 }
228
229 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes)
230 {
231     int p, b, t;
232
233     for (p = 0; p < 3; p++) {
234         for (b = 0; b < planes[p].num_bands; b++) {
235             av_freep(&planes[p].bands[b].bufs[0]);
236             av_freep(&planes[p].bands[b].bufs[1]);
237             av_freep(&planes[p].bands[b].bufs[2]);
238
239             if (planes[p].bands[b].blk_vlc.cust_tab.table)
240                 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
241             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
242                 av_freep(&planes[p].bands[b].tiles[t].mbs);
243             av_freep(&planes[p].bands[b].tiles);
244         }
245         av_freep(&planes[p].bands);
246     }
247 }
248
249 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
250 {
251     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
252     IVIBandDesc *band;
253     IVITile     *tile, *ref_tile;
254
255     for (p = 0; p < 3; p++) {
256         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
257         t_height = !p ? tile_height : (tile_height + 3) >> 2;
258
259         if (!p && planes[0].num_bands == 4) {
260             t_width  >>= 1;
261             t_height >>= 1;
262         }
263
264         for (b = 0; b < planes[p].num_bands; b++) {
265             band = &planes[p].bands[b];
266             x_tiles = IVI_NUM_TILES(band->width, t_width);
267             y_tiles = IVI_NUM_TILES(band->height, t_height);
268             band->num_tiles = x_tiles * y_tiles;
269
270             av_freep(&band->tiles);
271             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
272             if (!band->tiles)
273                 return AVERROR(ENOMEM);
274
275             tile = band->tiles;
276
277             /* use the first luma band as reference for motion vectors
278              * and quant */
279             ref_tile = planes[0].bands[0].tiles;
280
281             for (y = 0; y < band->height; y += t_height) {
282                 for (x = 0; x < band->width; x += t_width) {
283                     tile->xpos     = x;
284                     tile->ypos     = y;
285                     tile->width    = FFMIN(band->width - x,  t_width);
286                     tile->height   = FFMIN(band->height - y, t_height);
287                     tile->is_empty = tile->data_size = 0;
288                     /* calculate number of macroblocks */
289                     tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
290                                                       band->mb_size);
291
292                     av_freep(&tile->mbs);
293                     tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
294                     if (!tile->mbs)
295                         return AVERROR(ENOMEM);
296
297                     tile->ref_mbs = 0;
298                     if (p || b) {
299                         tile->ref_mbs = ref_tile->mbs;
300                         ref_tile++;
301                     }
302
303                     tile++;
304                 }
305             }
306
307         }// for b
308     }// for p
309
310     return 0;
311 }
312
313 int ff_ivi_dec_tile_data_size(GetBitContext *gb)
314 {
315     int    len;
316
317     len = 0;
318     if (get_bits1(gb)) {
319         len = get_bits(gb, 8);
320         if (len == 255)
321             len = get_bits_long(gb, 24);
322     }
323
324     /* align the bitstream reader on the byte boundary */
325     align_get_bits(gb);
326
327     return len;
328 }
329
330 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile)
331 {
332     int         mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
333                 pos, is_intra, mc_type, mv_x, mv_y, col_mask;
334     uint8_t     col_flags[8];
335     int32_t     prev_dc, trvec[64];
336     uint32_t    cbp, sym, lo, hi, quant, buf_offs, q;
337     IVIMbInfo   *mb;
338     RVMapDesc   *rvmap = band->rv_map;
339     void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
340     void (*mc_no_delta_func)  (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
341     const uint8_t   *base_tab, *scale_tab;
342
343     prev_dc = 0; /* init intra prediction for the DC coefficient */
344
345     blk_size   = band->blk_size;
346     col_mask   = blk_size - 1; /* column mask for tracking non-zero coeffs */
347     num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
348     num_coeffs = blk_size * blk_size;
349     if (blk_size == 8) {
350         mc_with_delta_func = ff_ivi_mc_8x8_delta;
351         mc_no_delta_func   = ff_ivi_mc_8x8_no_delta;
352     } else {
353         mc_with_delta_func = ff_ivi_mc_4x4_delta;
354         mc_no_delta_func   = ff_ivi_mc_4x4_no_delta;
355     }
356
357     for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
358         is_intra = !mb->type;
359         cbp      = mb->cbp;
360         buf_offs = mb->buf_offs;
361
362         quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
363
364         base_tab  = is_intra ? band->intra_base  : band->inter_base;
365         scale_tab = is_intra ? band->intra_scale : band->inter_scale;
366
367         if (!is_intra) {
368             mv_x = mb->mv_x;
369             mv_y = mb->mv_y;
370             if (!band->is_halfpel) {
371                 mc_type = 0; /* we have only fullpel vectors */
372             } else {
373                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
374                 mv_x >>= 1;
375                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
376             }
377         }
378
379         for (blk = 0; blk < num_blocks; blk++) {
380             /* adjust block position in the buffer according to its number */
381             if (blk & 1) {
382                 buf_offs += blk_size;
383             } else if (blk == 2) {
384                 buf_offs -= blk_size;
385                 buf_offs += blk_size * band->pitch;
386             }
387
388             if (cbp & 1) { /* block coded ? */
389                 scan_pos = -1;
390                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
391                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
392
393                 while (scan_pos <= num_coeffs) {
394                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
395                     if (sym == rvmap->eob_sym)
396                         break; /* End of block */
397
398                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
399                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
400                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
401                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
402                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
403                     } else {
404                         run = rvmap->runtab[sym];
405                         val = rvmap->valtab[sym];
406                     }
407
408                     /* de-zigzag and dequantize */
409                     scan_pos += run;
410                     if (scan_pos >= num_coeffs)
411                         break;
412                     pos = band->scan[scan_pos];
413
414                     if (IVI_DEBUG && !val)
415                         av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n");
416
417                     q = (base_tab[pos] * scale_tab[quant]) >> 8;
418                     if (q > 1)
419                         val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1));
420                     trvec[pos] = val;
421                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
422                 }// while
423
424                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
425                     return -1; /* corrupt block data */
426
427                 /* undoing DC coeff prediction for intra-blocks */
428                 if (is_intra && band->is_2d_trans) {
429                     prev_dc      += trvec[0];
430                     trvec[0]      = prev_dc;
431                     col_flags[0] |= !!prev_dc;
432                 }
433
434                 /* apply inverse transform */
435                 band->inv_transform(trvec, band->buf + buf_offs,
436                                     band->pitch, col_flags);
437
438                 /* apply motion compensation */
439                 if (!is_intra)
440                     mc_with_delta_func(band->buf + buf_offs,
441                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
442                                        band->pitch, mc_type);
443             } else {
444                 /* block not coded */
445                 /* for intra blocks apply the dc slant transform */
446                 /* for inter - perform the motion compensation without delta */
447                 if (is_intra && band->dc_transform) {
448                     band->dc_transform(&prev_dc, band->buf + buf_offs,
449                                        band->pitch, blk_size);
450                 } else
451                     mc_no_delta_func(band->buf + buf_offs,
452                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
453                                      band->pitch, mc_type);
454             }
455
456             cbp >>= 1;
457         }// for blk
458     }// for mbn
459
460     align_get_bits(gb);
461
462     return 0;
463 }
464
465 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
466                                IVITile *tile, int32_t mv_scale)
467 {
468     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
469     int             offs, mb_offset, row_offset;
470     IVIMbInfo       *mb, *ref_mb;
471     const int16_t   *src;
472     int16_t         *dst;
473     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
474                              int mc_type);
475
476     offs       = tile->ypos * band->pitch + tile->xpos;
477     mb         = tile->mbs;
478     ref_mb     = tile->ref_mbs;
479     row_offset = band->mb_size * band->pitch;
480     need_mc    = 0; /* reset the mc tracking flag */
481
482     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
483         mb_offset = offs;
484
485         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
486             mb->xpos     = x;
487             mb->ypos     = y;
488             mb->buf_offs = mb_offset;
489
490             mb->type = 1; /* set the macroblocks type = INTER */
491             mb->cbp  = 0; /* all blocks are empty */
492
493             if (!band->qdelta_present && !band->plane && !band->band_num) {
494                 mb->q_delta = band->glob_quant;
495                 mb->mv_x    = 0;
496                 mb->mv_y    = 0;
497             }
498
499             if (band->inherit_qdelta && ref_mb)
500                 mb->q_delta = ref_mb->q_delta;
501
502             if (band->inherit_mv) {
503                 /* motion vector inheritance */
504                 if (mv_scale) {
505                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
506                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
507                 } else {
508                     mb->mv_x = ref_mb->mv_x;
509                     mb->mv_y = ref_mb->mv_y;
510                 }
511                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
512             }
513
514             mb++;
515             if (ref_mb)
516                 ref_mb++;
517             mb_offset += band->mb_size;
518         } // for x
519         offs += row_offset;
520     } // for y
521
522     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
523         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
524         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
525                                                  : ff_ivi_mc_4x4_no_delta;
526
527         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
528             mv_x = mb->mv_x;
529             mv_y = mb->mv_y;
530             if (!band->is_halfpel) {
531                 mc_type = 0; /* we have only fullpel vectors */
532             } else {
533                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
534                 mv_x >>= 1;
535                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
536             }
537
538             for (blk = 0; blk < num_blocks; blk++) {
539                 /* adjust block position in the buffer according with its number */
540                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
541                 mc_no_delta_func(band->buf + offs,
542                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
543                                  band->pitch, mc_type);
544             }
545         }
546     } else {
547         /* copy data from the reference tile into the current one */
548         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
549         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
550         for (y = 0; y < tile->height; y++) {
551             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
552             src += band->pitch;
553             dst += band->pitch;
554         }
555     }
556 }
557
558
559 #if IVI_DEBUG
560 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
561 {
562     int         x, y;
563     int16_t     *src, checksum;
564
565     src = band->buf;
566     checksum = 0;
567
568     for (y = 0; y < band->height; src += band->pitch, y++)
569         for (x = 0; x < band->width; x++)
570             checksum += src[x];
571
572     return checksum;
573 }
574
575 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
576 {
577     int         x, y, result;
578     uint8_t     t1, t2;
579     int16_t    *src;
580
581     src = band->buf;
582     result = 0;
583
584     for (y = 0; y < band->height; src += band->pitch, y++) {
585         for (x = 0; x < band->width; x++) {
586             t1 = av_clip(src[x] + 128, 0, 255);
587             t2 = ref[x];
588             if (t1 != t2) {
589                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
590                        y / band->blk_size, x / band->blk_size);
591                 result = -1;
592             }
593         }
594         ref += pitch;
595     }
596
597     return result;
598 }
599 #endif
600
601 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
602 {
603     int             x, y;
604     const int16_t   *src  = plane->bands[0].buf;
605     uint32_t        pitch = plane->bands[0].pitch;
606
607     for (y = 0; y < plane->height; y++) {
608         for (x = 0; x < plane->width; x++)
609             dst[x] = av_clip_uint8(src[x] + 128);
610         src += pitch;
611         dst += dst_pitch;
612     }
613 }
614
615
616 /**
617  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
618  * signals. They are specified using "huffman descriptors" in order to
619  * avoid huge static tables. The decoding tables will be generated at
620  * startup from these descriptors.
621  */
622 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
623     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
624     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
625     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
626     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
627     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
628     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
629     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
630     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
631 };
632
633 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
634     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
635     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
636     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
637     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
638     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
639     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
640     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
641     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
642 };
643
644
645 /**
646  *  Run-value (RLE) tables.
647  */
648 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
649 {   /* MapTab0 */
650     5, /* eob_sym */
651     2, /* esc_sym */
652     /* run table */
653     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
654      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
655      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
656      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
657      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
658      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
659      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
660      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
661      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
662      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
663     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
664      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
665      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
666      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
667      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
668     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
669
670     /* value table */
671     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
672       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
673      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
674       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
675      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
676       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
677       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
678       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
679      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
680       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
681      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
682       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
683     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
684      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
685       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
686      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
687 },{
688     /* MapTab1 */
689     0,  /* eob_sym */
690     38, /* esc_sym */
691     /* run table */
692     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
693      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
694     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
695     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
696     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
697     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
698     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
699     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
700     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
701     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
702     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
703      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
704     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
705     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
706     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
707      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
708
709     /* value table */
710     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
711     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
712     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
713      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
714      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
715      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
716     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
717     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
718      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
719      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
720      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
721      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
722      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
723      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
724     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
725     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
726 },{
727     /* MapTab2 */
728     2,  /* eob_sym */
729     11, /* esc_sym */
730     /* run table */
731     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
732      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
733      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
734      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
735      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
736      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
737     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
738     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
739     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
740      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
741      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
742     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
743     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
744     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
745      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
746      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
747
748     /* value table */
749     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
750       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
751      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
752       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
753       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
754       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
755       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
756       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
757       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
758      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
759     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
760      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
761       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
762      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
763      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
764      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
765 },{
766     /* MapTab3 */
767     0,  /* eob_sym */
768     35, /* esc_sym */
769     /* run table */
770     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
771      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
772      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
773      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
774     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
775      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
776      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
777     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
778     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
779     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
780     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
781      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
782     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
783     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
784     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
785     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
786
787     /* value table */
788     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
789      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
790      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
791       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
792       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
793       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
794       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
795      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
796       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
797       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
798      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
799      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
800      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
801       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
802      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
803      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
804 },{
805     /* MapTab4 */
806     0,  /* eob_sym */
807     34, /* esc_sym */
808     /* run table */
809     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
810      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
811      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
812      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
813      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
814      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
815      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
816      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
817      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
818      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
819      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
820      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
821      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
822      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
823      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
824      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
825
826     /* value table */
827     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
828       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
829       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
830       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
831      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
832      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
833       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
834       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
835       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
836     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
837     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
838      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
839     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
840       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
841      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
842      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
843 },{
844     /* MapTab5 */
845     2,  /* eob_sym */
846     33, /* esc_sym */
847     /* run table */
848     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
849      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
850      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
851     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
852      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
853      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
854      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
855      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
856      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
857      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
858      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
859      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
860      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
861     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
862      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
863     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
864
865     /* value table */
866     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
867      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
868      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
869       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
870       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
871       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
872      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
873      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
874     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
875      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
876      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
877       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
878      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
879      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
880      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
881      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
882 },{
883     /* MapTab6 */
884     2,  /* eob_sym */
885     13, /* esc_sym */
886     /* run table */
887     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
888      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
889      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
890      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
891      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
892      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
893     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
894      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
895     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
896      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
897      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
898      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
899      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
900     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
901      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
902     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
903
904     /* value table */
905     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
906        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
907        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
908        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
909      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
910        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
911       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
912       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
913        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
914       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
915       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
916      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
917       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
918       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
919        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
920        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
921 },{
922     /* MapTab7 */
923     2,  /* eob_sym */
924     38, /* esc_sym */
925     /* run table */
926     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
927      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
928      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
929     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
930      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
931     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
932     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
933     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
934     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
935     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
936      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
937     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
938      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
939      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
940      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
941     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
942
943     /* value table */
944     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
945      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
946      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
947       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
948       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
949      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
950      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
951       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
952      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
953      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
954      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
955      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
956      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
957      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
958       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
959       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
960 },{
961     /* MapTab8 */
962     4,  /* eob_sym */
963     11, /* esc_sym */
964     /* run table */
965     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
966      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
967      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
968      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
969      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
970      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
971      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
972     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
973      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
974      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
975      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
976     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
977     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
978      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
979     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
980     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
981
982     /* value table */
983     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
984       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
985       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
986       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
987      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
988       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
989      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
990       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
991     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
992      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
993       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
994       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
995      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
996       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
997       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
998       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
999 }
1000 };