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