]> git.sesse.net Git - ffmpeg/blob - libavcodec/ivi_common.c
indeo: track tile macroblock size
[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 Libav.
7  *
8  * Libav 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  * Libav 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 Libav; 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 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                     ff_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 av_cold int 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->bufs[0]  = av_malloc(buf_size);
216             band->bufs[1]  = av_malloc(buf_size);
217             if (!band->bufs[0] || !band->bufs[1])
218                 return AVERROR(ENOMEM);
219
220             /* allocate the 3rd band buffer for scalability mode */
221             if (cfg->luma_bands > 1) {
222                 band->bufs[2] = av_malloc(buf_size);
223                 if (!band->bufs[2])
224                     return AVERROR(ENOMEM);
225             }
226
227             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
228         }
229     }
230
231     return 0;
232 }
233
234 av_cold void ff_ivi_free_buffers(IVIPlaneDesc *planes)
235 {
236     int p, b, t;
237
238     for (p = 0; p < 3; p++) {
239         for (b = 0; b < planes[p].num_bands; b++) {
240             av_freep(&planes[p].bands[b].bufs[0]);
241             av_freep(&planes[p].bands[b].bufs[1]);
242             av_freep(&planes[p].bands[b].bufs[2]);
243
244             if (planes[p].bands[b].blk_vlc.cust_tab.table)
245                 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
246             for (t = 0; t < planes[p].bands[b].num_tiles; t++)
247                 av_freep(&planes[p].bands[b].tiles[t].mbs);
248             av_freep(&planes[p].bands[b].tiles);
249         }
250         av_freep(&planes[p].bands);
251     }
252 }
253
254 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
255 {
256     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
257     IVIBandDesc *band;
258     IVITile     *tile, *ref_tile;
259
260     for (p = 0; p < 3; p++) {
261         t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
262         t_height = !p ? tile_height : (tile_height + 3) >> 2;
263
264         if (!p && planes[0].num_bands == 4) {
265             t_width  >>= 1;
266             t_height >>= 1;
267         }
268
269         for (b = 0; b < planes[p].num_bands; b++) {
270             band = &planes[p].bands[b];
271             x_tiles = IVI_NUM_TILES(band->width, t_width);
272             y_tiles = IVI_NUM_TILES(band->height, t_height);
273             band->num_tiles = x_tiles * y_tiles;
274
275             av_freep(&band->tiles);
276             band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
277             if (!band->tiles)
278                 return AVERROR(ENOMEM);
279
280             tile = band->tiles;
281
282             /* use the first luma band as reference for motion vectors
283              * and quant */
284             ref_tile = planes[0].bands[0].tiles;
285
286             for (y = 0; y < band->height; y += t_height) {
287                 for (x = 0; x < band->width; x += t_width) {
288                     tile->xpos     = x;
289                     tile->ypos     = y;
290                     tile->mb_size  = band->mb_size;
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 = 0, 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 = ((mv_y & 1) << 1) | (mv_x & 1);
381                 mv_x >>= 1;
382                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
383             }
384         }
385
386         for (blk = 0; blk < num_blocks; blk++) {
387             /* adjust block position in the buffer according to its number */
388             if (blk & 1) {
389                 buf_offs += blk_size;
390             } else if (blk == 2) {
391                 buf_offs -= blk_size;
392                 buf_offs += blk_size * band->pitch;
393             }
394
395             if (cbp & 1) { /* block coded ? */
396                 scan_pos = -1;
397                 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
398                 memset(col_flags, 0, sizeof(col_flags));      /* zero column flags */
399
400                 while (scan_pos <= num_coeffs) {
401                     sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
402                     if (sym == rvmap->eob_sym)
403                         break; /* End of block */
404
405                     if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
406                         run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
407                         lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
408                         hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
409                         val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
410                     } else {
411                         if (sym >= 256U) {
412                             av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
413                             return -1;
414                         }
415                         run = rvmap->runtab[sym];
416                         val = rvmap->valtab[sym];
417                     }
418
419                     /* de-zigzag and dequantize */
420                     scan_pos += run;
421                     if (scan_pos >= num_coeffs)
422                         break;
423                     pos = band->scan[scan_pos];
424
425                     if (!val)
426                         av_dlog(NULL, "Val = 0 encountered!\n");
427
428                     q = (base_tab[pos] * quant) >> 9;
429                     if (q > 1)
430                         val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
431                     trvec[pos] = val;
432                     col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
433                 }// while
434
435                 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
436                     return -1; /* corrupt block data */
437
438                 /* undoing DC coeff prediction for intra-blocks */
439                 if (is_intra && band->is_2d_trans) {
440                     prev_dc      += trvec[0];
441                     trvec[0]      = prev_dc;
442                     col_flags[0] |= !!prev_dc;
443                 }
444
445                 /* apply inverse transform */
446                 band->inv_transform(trvec, band->buf + buf_offs,
447                                     band->pitch, col_flags);
448
449                 /* apply motion compensation */
450                 if (!is_intra)
451                     mc_with_delta_func(band->buf + buf_offs,
452                                        band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
453                                        band->pitch, mc_type);
454             } else {
455                 /* block not coded */
456                 /* for intra blocks apply the dc slant transform */
457                 /* for inter - perform the motion compensation without delta */
458                 if (is_intra && band->dc_transform) {
459                     band->dc_transform(&prev_dc, band->buf + buf_offs,
460                                        band->pitch, blk_size);
461                 } else
462                     mc_no_delta_func(band->buf + buf_offs,
463                                      band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
464                                      band->pitch, mc_type);
465             }
466
467             cbp >>= 1;
468         }// for blk
469     }// for mbn
470
471     align_get_bits(gb);
472
473     return 0;
474 }
475
476 void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
477                                IVITile *tile, int32_t mv_scale)
478 {
479     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
480     int             offs, mb_offset, row_offset;
481     IVIMbInfo       *mb, *ref_mb;
482     const int16_t   *src;
483     int16_t         *dst;
484     void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
485                              int mc_type);
486
487     offs       = tile->ypos * band->pitch + tile->xpos;
488     mb         = tile->mbs;
489     ref_mb     = tile->ref_mbs;
490     row_offset = band->mb_size * band->pitch;
491     need_mc    = 0; /* reset the mc tracking flag */
492
493     for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
494         mb_offset = offs;
495
496         for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
497             mb->xpos     = x;
498             mb->ypos     = y;
499             mb->buf_offs = mb_offset;
500
501             mb->type = 1; /* set the macroblocks type = INTER */
502             mb->cbp  = 0; /* all blocks are empty */
503
504             if (!band->qdelta_present && !band->plane && !band->band_num) {
505                 mb->q_delta = band->glob_quant;
506                 mb->mv_x    = 0;
507                 mb->mv_y    = 0;
508             }
509
510             if (band->inherit_qdelta && ref_mb)
511                 mb->q_delta = ref_mb->q_delta;
512
513             if (band->inherit_mv) {
514                 /* motion vector inheritance */
515                 if (mv_scale) {
516                     mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
517                     mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
518                 } else {
519                     mb->mv_x = ref_mb->mv_x;
520                     mb->mv_y = ref_mb->mv_y;
521                 }
522                 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
523             }
524
525             mb++;
526             if (ref_mb)
527                 ref_mb++;
528             mb_offset += band->mb_size;
529         } // for x
530         offs += row_offset;
531     } // for y
532
533     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
534         num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
535         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
536                                                  : ff_ivi_mc_4x4_no_delta;
537
538         for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
539             mv_x = mb->mv_x;
540             mv_y = mb->mv_y;
541             if (!band->is_halfpel) {
542                 mc_type = 0; /* we have only fullpel vectors */
543             } else {
544                 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
545                 mv_x >>= 1;
546                 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
547             }
548
549             for (blk = 0; blk < num_blocks; blk++) {
550                 /* adjust block position in the buffer according with its number */
551                 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
552                 mc_no_delta_func(band->buf + offs,
553                                  band->ref_buf + offs + mv_y * band->pitch + mv_x,
554                                  band->pitch, mc_type);
555             }
556         }
557     } else {
558         /* copy data from the reference tile into the current one */
559         src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
560         dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
561         for (y = 0; y < tile->height; y++) {
562             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
563             src += band->pitch;
564             dst += band->pitch;
565         }
566     }
567 }
568
569
570 #ifdef DEBUG
571 uint16_t ivi_calc_band_checksum (IVIBandDesc *band)
572 {
573     int         x, y;
574     int16_t     *src, checksum;
575
576     src = band->buf;
577     checksum = 0;
578
579     for (y = 0; y < band->height; src += band->pitch, y++)
580         for (x = 0; x < band->width; x++)
581             checksum += src[x];
582
583     return checksum;
584 }
585
586 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch)
587 {
588     int         x, y, result;
589     uint8_t     t1, t2;
590     int16_t    *src;
591
592     src = band->buf;
593     result = 0;
594
595     for (y = 0; y < band->height; src += band->pitch, y++) {
596         for (x = 0; x < band->width; x++) {
597             t1 = av_clip(src[x] + 128, 0, 255);
598             t2 = ref[x];
599             if (t1 != t2) {
600                 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n",
601                        y / band->blk_size, x / band->blk_size);
602                 result = -1;
603             }
604         }
605         ref += pitch;
606     }
607
608     return result;
609 }
610 #endif
611
612 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
613 {
614     int             x, y;
615     const int16_t   *src  = plane->bands[0].buf;
616     uint32_t        pitch = plane->bands[0].pitch;
617
618     if (!src)
619         return;
620
621     for (y = 0; y < plane->height; y++) {
622         for (x = 0; x < plane->width; x++)
623             dst[x] = av_clip_uint8(src[x] + 128);
624         src += pitch;
625         dst += dst_pitch;
626     }
627 }
628
629 /**
630  *  Decode an Indeo 4 or 5 band.
631  *
632  *  @param[in,out]  ctx    ptr to the decoder context
633  *  @param[in,out]  band   ptr to the band descriptor
634  *  @param[in]      avctx  ptr to the AVCodecContext
635  *  @return         result code: 0 = OK, -1 = error
636  */
637 static int decode_band(IVI45DecContext *ctx, int plane_num,
638                        IVIBandDesc *band, AVCodecContext *avctx)
639 {
640     int         result, i, t, idx1, idx2, pos;
641     IVITile     *tile;
642
643     band->buf     = band->bufs[ctx->dst_buf];
644     band->ref_buf = band->bufs[ctx->ref_buf];
645     band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
646
647     result = ctx->decode_band_hdr(ctx, band, avctx);
648     if (result) {
649         av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
650                result);
651         return result;
652     }
653
654     if (band->is_empty) {
655         av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
656         return AVERROR_INVALIDDATA;
657     }
658
659     band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
660
661     /* apply corrections to the selected rvmap table if present */
662     for (i = 0; i < band->num_corr; i++) {
663         idx1 = band->corr[i * 2];
664         idx2 = band->corr[i * 2 + 1];
665         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
666         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
667     }
668
669     pos = get_bits_count(&ctx->gb);
670
671     for (t = 0; t < band->num_tiles; t++) {
672         tile = &band->tiles[t];
673
674         if (tile->mb_size != band->mb_size) {
675             av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
676                    band->mb_size, tile->mb_size);
677             return AVERROR_INVALIDDATA;
678         }
679         tile->is_empty = get_bits1(&ctx->gb);
680         if (tile->is_empty) {
681             ff_ivi_process_empty_tile(avctx, band, tile,
682                                       (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
683             av_dlog(avctx, "Empty tile encountered!\n");
684         } else {
685             tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb);
686             if (!tile->data_size) {
687                 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
688                 return AVERROR_INVALIDDATA;
689             }
690
691             result = ctx->decode_mb_info(ctx, band, tile, avctx);
692             if (result < 0)
693                 break;
694
695             result = ff_ivi_decode_blocks(&ctx->gb, band, tile);
696             if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
697                 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
698                 break;
699             }
700
701             pos += tile->data_size << 3; // skip to next tile
702         }
703     }
704
705     /* restore the selected rvmap table by applying its corrections in reverse order */
706     for (i = band->num_corr-1; i >= 0; i--) {
707         idx1 = band->corr[i*2];
708         idx2 = band->corr[i*2+1];
709         FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
710         FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
711     }
712
713 #ifdef DEBUG
714     if (band->checksum_present) {
715         uint16_t chksum = ivi_calc_band_checksum(band);
716         if (chksum != band->checksum) {
717             av_log(avctx, AV_LOG_ERROR,
718                    "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
719                    band->plane, band->band_num, band->checksum, chksum);
720         }
721     }
722 #endif
723
724     align_get_bits(&ctx->gb);
725
726     return result;
727 }
728
729 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
730                         AVPacket *avpkt)
731 {
732     IVI45DecContext *ctx = avctx->priv_data;
733     const uint8_t   *buf = avpkt->data;
734     int             buf_size = avpkt->size;
735     int             result, p, b;
736
737     init_get_bits(&ctx->gb, buf, buf_size * 8);
738     ctx->frame_data = buf;
739     ctx->frame_size = buf_size;
740
741     result = ctx->decode_pic_hdr(ctx, avctx);
742     if (result) {
743         av_log(avctx, AV_LOG_ERROR,
744                "Error while decoding picture header: %d\n", result);
745         return -1;
746     }
747
748     if (ctx->gop_flags & IVI5_IS_PROTECTED) {
749         av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
750         return -1;
751     }
752
753     ctx->switch_buffers(ctx);
754
755     //{ START_TIMER;
756
757     if (ctx->is_nonnull_frame(ctx)) {
758         for (p = 0; p < 3; p++) {
759             for (b = 0; b < ctx->planes[p].num_bands; b++) {
760                 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx);
761                 if (result) {
762                     av_log(avctx, AV_LOG_ERROR,
763                            "Error while decoding band: %d, plane: %d\n", b, p);
764                     return -1;
765                 }
766             }
767         }
768     }
769
770     //STOP_TIMER("decode_planes"); }
771
772     /* If the bidirectional mode is enabled, next I and the following P frame will */
773     /* be sent together. Unfortunately the approach below seems to be the only way */
774     /* to handle the B-frames mode. That's exactly the same Intel decoders do.     */
775     if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
776         while (get_bits(&ctx->gb, 8)); // skip version string
777         skip_bits_long(&ctx->gb, 64);  // skip padding, TODO: implement correct 8-bytes alignment
778         if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
779             av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
780     }
781
782     if (ctx->frame.data[0])
783         avctx->release_buffer(avctx, &ctx->frame);
784
785     ctx->frame.reference = 0;
786     if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) {
787         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
788         return result;
789     }
790
791     if (ctx->is_scalable) {
792         if (avctx->codec_id == CODEC_ID_INDEO4)
793             ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
794         else
795             ff_ivi_recompose53   (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4);
796     } else {
797         ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
798     }
799
800     ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
801     ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
802
803     *data_size = sizeof(AVFrame);
804     *(AVFrame*)data = ctx->frame;
805
806     return buf_size;
807 }
808
809 /**
810  *  Close Indeo5 decoder and clean up its context.
811  */
812 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
813 {
814     IVI45DecContext *ctx = avctx->priv_data;
815
816     ff_ivi_free_buffers(&ctx->planes[0]);
817
818     if (ctx->mb_vlc.cust_tab.table)
819         ff_free_vlc(&ctx->mb_vlc.cust_tab);
820
821     if (ctx->frame.data[0])
822         avctx->release_buffer(avctx, &ctx->frame);
823
824 #if IVI4_STREAM_ANALYSER
825     if (avctx->codec_id == CODEC_ID_INDEO4) {
826     if (ctx->is_scalable)
827         av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
828     if (ctx->uses_tiling)
829         av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
830     if (ctx->has_b_frames)
831         av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
832     if (ctx->has_transp)
833         av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
834     if (ctx->uses_haar)
835         av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
836     if (ctx->uses_fullpel)
837         av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
838     }
839 #endif
840
841     return 0;
842 }
843
844
845 /**
846  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
847  * signals. They are specified using "huffman descriptors" in order to
848  * avoid huge static tables. The decoding tables will be generated at
849  * startup from these descriptors.
850  */
851 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
852     {8,  {0, 4, 5, 4, 4, 4, 6, 6}},
853     {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
854     {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
855     {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
856     {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
857     {9,  {0, 4, 4, 4, 4, 3, 3, 3, 2}},
858     {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
859     {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
860 };
861
862 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
863     {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
864     {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
865     {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
866     {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
867     {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
868     {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
869     {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
870     {9,  {3, 4, 4, 5, 5, 5, 6, 5, 5}}
871 };
872
873
874 /**
875  *  Scan patterns shared between indeo4 and indeo5
876  */
877 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
878     0,  8, 16, 24, 32, 40, 48, 56,
879     1,  9, 17, 25, 33, 41, 49, 57,
880     2, 10, 18, 26, 34, 42, 50, 58,
881     3, 11, 19, 27, 35, 43, 51, 59,
882     4, 12, 20, 28, 36, 44, 52, 60,
883     5, 13, 21, 29, 37, 45, 53, 61,
884     6, 14, 22, 30, 38, 46, 54, 62,
885     7, 15, 23, 31, 39, 47, 55, 63
886 };
887
888 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
889      0,  1,  2,  3,  4,  5,  6,  7,
890      8,  9, 10, 11, 12, 13, 14, 15,
891     16, 17, 18, 19, 20, 21, 22, 23,
892     24, 25, 26, 27, 28, 29, 30, 31,
893     32, 33, 34, 35, 36, 37, 38, 39,
894     40, 41, 42, 43, 44, 45, 46, 47,
895     48, 49, 50, 51, 52, 53, 54, 55,
896     56, 57, 58, 59, 60, 61, 62, 63
897 };
898
899 const uint8_t ff_ivi_direct_scan_4x4[16] = {
900     0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
901 };
902
903
904 /**
905  *  Run-value (RLE) tables.
906  */
907 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
908 {   /* MapTab0 */
909     5, /* eob_sym */
910     2, /* esc_sym */
911     /* run table */
912     {1,  1,  0,  1,  1,  0,  1,  1,  2,  2,  1,  1,  1,  1,  3,  3,
913      1,  1,  2,  2,  1,  1,  4,  4,  1,  1,  1,  1,  2,  2,  5,  5,
914      1,  1,  3,  3,  1,  1,  6,  6,  1,  2,  1,  2,  7,  7,  1,  1,
915      8,  8,  1,  1,  4,  2,  1,  4,  2,  1,  3,  3,  1,  1,  1,  9,
916      9,  1,  2,  1,  2,  1,  5,  5,  1,  1, 10, 10,  1,  1,  3,  3,
917      2,  2,  1,  1, 11, 11,  6,  4,  4,  1,  6,  1,  2,  1,  2, 12,
918      8,  1, 12,  7,  8,  7,  1, 16,  1, 16,  1,  3,  3, 13,  1, 13,
919      2,  2,  1, 15,  1,  5, 14, 15,  1,  5, 14,  1, 17,  8, 17,  8,
920      1,  4,  4,  2,  2,  1, 25, 25, 24, 24,  1,  3,  1,  3,  1,  8,
921      6,  7,  6,  1, 18,  8, 18,  1,  7, 23,  2,  2, 23,  1,  1, 21,
922     22,  9,  9, 22, 19,  1, 21,  5, 19,  5,  1, 33, 20, 33, 20,  8,
923      4,  4,  1, 32,  2,  2,  8,  3, 32, 26,  3,  1,  7,  7, 26,  6,
924      1,  6,  1,  1, 16,  1, 10,  1, 10,  2, 16, 29, 28,  2, 29, 28,
925      1, 27,  5,  8,  5, 27,  1,  8,  3,  7,  3, 31, 41, 31,  1, 41,
926      6,  1,  6,  7,  4,  4,  1,  1,  2,  1,  2, 11, 34, 30, 11,  1,
927     30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
928
929     /* value table */
930     { 1,  -1,   0,   2,  -2,   0,   3,  -3,   1,  -1,   4,  -4,   5,  -5,   1,  -1,
931       6,  -6,   2,  -2,   7,  -7,   1,  -1,   8,  -8,   9,  -9,   3,  -3,   1,  -1,
932      10, -10,   2,  -2,  11, -11,   1,  -1,  12,   4, -12,  -4,   1,  -1,  13, -13,
933       1,  -1,  14, -14,   2,   5,  15,  -2,  -5, -15,  -3,   3,  16, -16,  17,   1,
934      -1, -17,   6,  18,  -6, -18,   2,  -2,  19, -19,   1,  -1,  20, -20,   4,  -4,
935       7,  -7,  21, -21,   1,  -1,   2,   3,  -3,  22,  -2, -22,   8,  23,  -8,   1,
936       2, -23,  -1,   2,  -2,  -2,  24,   1, -24,  -1,  25,   5,  -5,   1, -25,  -1,
937       9,  -9,  26,   1, -26,   3,   1,  -1,  27,  -3,  -1, -27,   1,   3,  -1,  -3,
938      28,  -4,   4,  10, -10, -28,   1,  -1,   1,  -1,  29,   6, -29,  -6,  30,  -4,
939       3,   3,  -3, -30,   1,   4,  -1,  31,  -3,   1,  11, -11,  -1, -31,  32,  -1,
940      -1,   2,  -2,   1,   1, -32,   1,   4,  -1,  -4,  33,  -1,   1,   1,  -1,   5,
941       5,  -5, -33,  -1, -12,  12,  -5,  -7,   1,   1,   7,  34,   4,  -4,  -1,   4,
942     -34,  -4,  35,  36,  -2, -35,  -2, -36,   2,  13,   2,  -1,   1, -13,   1,  -1,
943      37,   1,  -5,   6,   5,  -1,  38,  -6,  -8,   5,   8,  -1,   1,   1, -37,  -1,
944       5,  39,  -5,  -5,   6,  -6, -38, -39, -14,  40,  14,   2,   1,   1,  -2, -40,
945      -1,  -2,   2,  -1,  -1,  -1,   1,   1,   1,  -1,   1,  -1,   1,  -1,   1,  -1}
946 },{
947     /* MapTab1 */
948     0,  /* eob_sym */
949     38, /* esc_sym */
950     /* run table */
951     {0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  8,  6,  8,  7,
952      7,  9,  9, 10, 10, 11, 11,  1, 12,  1, 12, 13, 13, 16, 14, 16,
953     14, 15, 15, 17, 17, 18,  0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
954     25, 24,  2, 25, 24, 23, 23,  2, 26, 28, 26, 28, 29, 27, 29, 27,
955     33, 33,  1, 32,  1,  3, 32, 30, 36,  3, 36, 30, 31, 31, 35, 34,
956     37, 41, 34, 35, 37,  4, 41,  4, 49,  8,  8, 49, 40, 38,  5, 38,
957     40, 39,  5, 39, 42, 43, 42,  7, 57,  6, 43, 44,  6, 50,  7, 44,
958     57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58,  1, 51, 58,  1,
959     52, 59, 53,  9, 52, 55, 55, 59, 53, 56, 54, 56, 54,  9, 64, 64,
960     60, 63, 60, 63, 61, 62, 61, 62,  2, 10,  2, 10, 11,  1, 11, 13,
961     12,  1, 12, 13, 16, 16,  8,  8, 14,  3,  3, 15, 14, 15,  4,  4,
962      1, 17, 17,  5,  1,  7,  7,  5,  6,  1,  2,  2,  6, 22,  1, 25,
963     21, 22,  8, 24,  1, 21, 25, 24,  8, 18, 18, 23,  9, 20, 23, 33,
964     29, 33, 20,  1, 19,  1, 29, 36,  9, 36, 19, 41, 28, 57, 32,  3,
965     28,  3,  1, 27, 49, 49,  1, 32, 26, 26,  2,  4,  4,  7, 57, 41,
966      2,  7, 10,  5, 37, 16, 10, 27,  8,  8, 13, 16, 37, 13,  1,  5},
967
968     /* value table */
969     {0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,   1,  -1,  -1,   1,
970     -1,   1,  -1,   1,  -1,   1,  -1,   2,   1,  -2,  -1,   1,  -1,   1,   1,  -1,
971     -1,   1,  -1,   1,  -1,   1,   0,  -1,   1,   1,   1,  -1,   1,  -1,  -1,  -1,
972      1,   1,   2,  -1,  -1,   1,  -1,  -2,   1,   1,  -1,  -1,   1,   1,  -1,  -1,
973      1,  -1,   3,   1,  -3,   2,  -1,   1,   1,  -2,  -1,  -1,  -1,   1,   1,   1,
974      1,   1,  -1,  -1,  -1,   2,  -1,  -2,   1,   2,  -2,  -1,   1,   1,   2,  -1,
975     -1,   1,  -2,  -1,   1,   1,  -1,   2,   1,   2,  -1,   1,  -2,  -1,  -2,  -1,
976     -1,   1,   1,  -1,   1,  -1,   1,   1,   1,  -1,  -1,   1,   4,  -1,  -1,  -4,
977      1,   1,   1,   2,  -1,  -1,   1,  -1,  -1,   1,  -1,  -1,   1,  -2,   1,  -1,
978      1,   1,  -1,  -1,   1,   1,  -1,  -1,   3,   2,  -3,  -2,   2,   5,  -2,   2,
979      2,  -5,  -2,  -2,  -2,   2,  -3,   3,   2,   3,  -3,   2,  -2,  -2,   3,  -3,
980      6,   2,  -2,   3,  -6,   3,  -3,  -3,   3,   7,  -4,   4,  -3,   2,  -7,   2,
981      2,  -2,  -4,   2,   8,  -2,  -2,  -2,   4,   2,  -2,   2,   3,   2,  -2,  -2,
982      2,   2,  -2,  -8,  -2,   9,  -2,   2,  -3,  -2,   2,  -2,   2,   2,   2,   4,
983     -2,  -4,  10,   2,   2,  -2,  -9,  -2,   2,  -2,   5,   4,  -4,   4,  -2,   2,
984     -5,  -4,  -3,   4,   2,  -3,   3,  -2,  -5,   5,   3,   3,  -2,  -3, -10,  -4}
985 },{
986     /* MapTab2 */
987     2,  /* eob_sym */
988     11, /* esc_sym */
989     /* run table */
990     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  0,  1,  1,  5,  5,
991      2,  2,  6,  6,  7,  7,  1,  8,  1,  8,  3,  3,  9,  9,  1,  2,
992      2,  1,  4, 10,  4, 10, 11, 11,  1,  5, 12, 12,  1,  5, 13, 13,
993      3,  3,  6,  6,  2,  2, 14, 14, 16, 16, 15,  7, 15,  8,  8,  7,
994      1,  1, 17, 17,  4,  4,  1,  1, 18, 18,  2,  2,  5,  5, 25,  3,
995      9,  3, 25,  9, 19, 24, 19, 24,  1, 21, 20,  1, 21, 22, 20, 22,
996     23, 23,  8,  6, 33,  6,  8, 33,  7,  7, 26, 26,  1, 32,  1, 32,
997     28,  4, 28, 10, 29, 27, 27, 10, 41,  4, 29,  2,  2, 41, 36, 31,
998     49, 31, 34, 30, 34, 36, 30, 35,  1, 49, 11,  5, 35, 11,  1,  3,
999      3,  5, 37, 37,  8, 40,  8, 40, 12, 12, 42, 42,  1, 38, 16, 57,
1000      1,  6, 16, 39, 38,  6,  7,  7, 13, 13, 39, 43,  2, 43, 57,  2,
1001     50,  9, 44,  9, 50,  4, 15, 48, 44,  4,  1, 15, 48, 14, 14,  1,
1002     45, 45,  8,  3,  5,  8, 51, 47,  3, 46, 46, 47,  5, 51,  1, 17,
1003     17, 58,  1, 58,  2, 52, 52,  2, 53,  7, 59,  6,  6, 56, 53, 55,
1004      7, 55,  1, 54, 59, 56, 54, 10,  1, 10,  4, 60,  1, 60,  8,  4,
1005      8, 64, 64, 61,  1, 63,  3, 63, 62, 61,  5, 11,  5,  3, 11, 62},
1006
1007     /* value table */
1008     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   0,   3,  -3,   1,  -1,
1009       2,  -2,   1,  -1,   1,  -1,   4,   1,  -4,  -1,   2,  -2,   1,  -1,   5,   3,
1010      -3,  -5,   2,   1,  -2,  -1,   1,  -1,   6,   2,   1,  -1,  -6,  -2,   1,  -1,
1011       3,  -3,   2,  -2,   4,  -4,   1,  -1,   1,  -1,   1,   2,  -1,   2,  -2,  -2,
1012       7,  -7,   1,  -1,   3,  -3,   8,  -8,   1,  -1,   5,  -5,   3,  -3,   1,   4,
1013       2,  -4,  -1,  -2,   1,   1,  -1,  -1,   9,   1,   1,  -9,  -1,   1,  -1,  -1,
1014       1,  -1,   3,  -3,   1,   3,  -3,  -1,   3,  -3,   1,  -1,  10,   1, -10,  -1,
1015       1,   4,  -1,   2,   1,  -1,   1,  -2,   1,  -4,  -1,   6,  -6,  -1,   1,   1,
1016       1,  -1,   1,   1,  -1,  -1,  -1,   1,  11,  -1,  -2,   4,  -1,   2, -11,   5,
1017      -5,  -4,  -1,   1,   4,   1,  -4,  -1,  -2,   2,   1,  -1,  12,   1,  -2,   1,
1018     -12,   4,   2,   1,  -1,  -4,   4,  -4,   2,  -2,  -1,   1,   7,  -1,  -1,  -7,
1019      -1,  -3,   1,   3,   1,   5,   2,   1,  -1,  -5,  13,  -2,  -1,   2,  -2, -13,
1020       1,  -1,   5,   6,   5,  -5,   1,   1,  -6,   1,  -1,  -1,  -5,  -1,  14,   2,
1021      -2,   1, -14,  -1,   8,   1,  -1,  -8,   1,   5,   1,   5,  -5,   1,  -1,   1,
1022      -5,  -1,  15,   1,  -1,  -1,  -1,   3, -15,  -3,   6,   1,  16,  -1,   6,  -6,
1023      -6,   1,  -1,   1, -16,   1,   7,  -1,   1,  -1,  -6,  -3,   6,  -7,   3,  -1}
1024 },{
1025     /* MapTab3 */
1026     0,  /* eob_sym */
1027     35, /* esc_sym */
1028     /* run table */
1029     {0,  1,  1,  2,  2,  3,  3,  4,  4,  1,  1,  5,  5,  6,  6,  7,
1030      7,  8,  8,  9,  9,  2,  2, 10, 10,  1,  1, 11, 11, 12, 12,  3,
1031      3, 13, 13,  0, 14, 14, 16, 15, 16, 15,  4,  4, 17,  1, 17,  1,
1032      5,  5, 18, 18,  2,  2,  6,  6,  8, 19,  7,  8,  7, 19, 20, 20,
1033     21, 21, 22, 24, 22, 24, 23, 23,  1,  1, 25, 25,  3,  3, 26, 26,
1034      9,  9, 27, 27, 28, 28, 33, 29,  4, 33, 29,  1,  4,  1, 32, 32,
1035      2,  2, 31, 10, 30, 10, 30, 31, 34, 34,  5,  5, 36, 36, 35, 41,
1036     35, 11, 41, 11, 37,  1,  8,  8, 37,  6,  1,  6, 40,  7,  7, 40,
1037     12, 38, 12, 39, 39, 38, 49, 13, 49, 13,  3, 42,  3, 42, 16, 16,
1038     43, 43, 14, 14,  1,  1, 44, 15, 44, 15,  2,  2, 57, 48, 50, 48,
1039     57, 50,  4, 45, 45,  4, 46, 47, 47, 46,  1, 51,  1, 17, 17, 51,
1040      8,  9,  9,  5, 58,  8, 58,  5, 52, 52, 55, 56, 53, 56, 55, 59,
1041     59, 53, 54,  1,  6, 54,  7,  7,  6,  1,  2,  3,  2,  3, 64, 60,
1042     60, 10, 10, 64, 61, 62, 61, 63,  1, 63, 62,  1, 18, 24, 18,  4,
1043     25,  4,  8, 21, 21,  1, 24, 22, 25, 22,  8, 11, 19, 11, 23,  1,
1044     20, 23, 19, 20,  5, 12,  5,  1, 16,  2, 12, 13,  2, 13,  1, 16},
1045
1046     /* value table */
1047     { 0,   1,  -1,   1,  -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,
1048      -1,   1,  -1,   1,  -1,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   1,  -1,   2,
1049      -2,   1,  -1,   0,   1,  -1,   1,   1,  -1,  -1,   2,  -2,   1,   4,  -1,  -4,
1050       2,  -2,   1,  -1,  -3,   3,   2,  -2,   2,   1,   2,  -2,  -2,  -1,   1,  -1,
1051       1,  -1,   1,   1,  -1,  -1,   1,  -1,   5,  -5,   1,  -1,   3,  -3,   1,  -1,
1052       2,  -2,   1,  -1,   1,  -1,   1,   1,   3,  -1,  -1,   6,  -3,  -6,  -1,   1,
1053       4,  -4,   1,   2,   1,  -2,  -1,  -1,   1,  -1,   3,  -3,   1,  -1,   1,   1,
1054      -1,   2,  -1,  -2,   1,   7,  -3,   3,  -1,   3,  -7,  -3,   1,  -3,   3,  -1,
1055       2,   1,  -2,   1,  -1,  -1,   1,   2,  -1,  -2,  -4,  -1,   4,   1,   2,  -2,
1056       1,  -1,  -2,   2,   8,  -8,  -1,   2,   1,  -2,  -5,   5,   1,  -1,  -1,   1,
1057      -1,   1,   4,  -1,   1,  -4,  -1,  -1,   1,   1,   9,   1,  -9,   2,  -2,  -1,
1058      -4,   3,  -3,  -4,  -1,   4,   1,   4,   1,  -1,   1,  -1,   1,   1,  -1,   1,
1059      -1,  -1,  -1,  10,   4,   1,   4,  -4,  -4, -10,   6,   5,  -6,  -5,   1,  -1,
1060       1,   3,  -3,  -1,   1,  -1,  -1,  -1,  11,   1,   1, -11,  -2,  -2,   2,   5,
1061      -2,  -5,  -5,   2,  -2,  12,   2,  -2,   2,   2,   5,  -3,  -2,   3,  -2, -12,
1062      -2,   2,   2,   2,  -5,   3,   5,  13,  -3,   7,  -3,  -3,  -7,   3, -13,   3}
1063 },{
1064     /* MapTab4 */
1065     0,  /* eob_sym */
1066     34, /* esc_sym */
1067     /* run table */
1068     {0,  1,  1,  1,  2,  2,  1,  3,  3,  1,  1,  1,  4,  4,  1,  5,
1069      2,  1,  5,  2,  1,  1,  6,  6,  1,  1,  1,  1,  1,  7,  3,  1,
1070      2,  3,  0,  1,  2,  7,  1,  1,  1,  8,  1,  1,  8,  1,  1,  1,
1071      9,  1,  9,  1,  2,  1,  1,  2,  1,  1, 10,  4,  1, 10,  1,  4,
1072      1,  1,  1,  1,  1,  3,  1,  1,  1,  3,  2,  1,  5,  1,  1,  1,
1073      2,  5,  1, 11,  1, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
1074      2,  1,  6,  1,  6,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1, 12,
1075      3,  1, 12,  1,  1,  1,  2,  1,  1,  3,  1,  1,  1,  1,  1,  1,
1076      4,  1,  1,  1,  2,  1,  1,  4,  1,  1,  1,  1,  1,  1,  2,  1,
1077      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  1,  2,  1,  1,  5,
1078      1,  1,  1,  1,  1,  7,  1,  7,  1,  1,  2,  3,  1,  1,  1,  1,
1079      5,  1,  1,  1,  1,  1,  1,  2, 13,  1,  1,  1,  1,  1,  1,  1,
1080      1,  1,  1,  1,  1,  1,  1,  1, 13,  2,  1,  1,  4,  1,  1,  1,
1081      3,  1,  6,  1,  1,  1, 14,  1,  1,  1,  1,  1, 14,  6,  1,  1,
1082      1,  1, 15,  2,  4,  1,  2,  3, 15,  1,  1,  1,  8,  1,  1,  8,
1083      1,  1,  1,  1,  1,  1,  1,  1,  2,  1,  1,  1,  1,  1,  1,  1},
1084
1085     /* value table */
1086     { 0,   1,  -1,   2,   1,  -1,  -2,   1,  -1,   3,  -3,   4,   1,  -1,  -4,   1,
1087       2,   5,  -1,  -2,  -5,   6,   1,  -1,  -6,   7,  -7,   8,  -8,   1,   2,   9,
1088       3,  -2,   0,  -9,  -3,  -1,  10, -10,  11,   1, -11,  12,  -1, -12,  13, -13,
1089       1,  14,  -1, -14,   4,  15, -15,  -4,  16, -16,   1,   2,  17,  -1, -17,  -2,
1090      18, -18,  19, -19,  20,   3, -20,  21, -21,  -3,   5,  22,   2, -22, -23,  23,
1091      -5,  -2,  24,   1, -24,  -1,  25, -25,  26, -26, -27,  27,  28,  29, -28, -29,
1092       6,  30,   2, -31,  -2, -30,  31,  -6, -32,  32,  33, -33,  34, -35, -34,   1,
1093       4, -36,  -1,  35,  37,  36,   7, -37,  38,  -4, -38,  39,  41,  40, -40, -39,
1094       3,  42, -43, -41,  -7, -42,  43,  -3,  44, -44,  45, -45,  46,  47,   8, -47,
1095     -48, -46,  50, -50,  48,  49,  51, -49,  52, -52,   5, -51,  -8, -53,  53,   3,
1096     -56,  56,  55,  54, -54,   2,  60,  -2, -55,  58,   9,  -5,  59,  57, -57, -63,
1097      -3, -58, -60, -61,  61, -59, -62,  -9,   1,  64,  62,  69, -64,  63,  65, -67,
1098     -68,  66, -65,  68, -66, -69,  67, -70,  -1,  10,  71, -71,   4,  73,  72,  70,
1099       6, -76,  -3,  74, -78, -74,   1,  78,  80, -72, -75,  76,  -1,   3, -73,  79,
1100      75,  77,   1,  11,  -4, -79, -10,  -6,  -1, -77, -83, -80,   2,  81, -84,  -2,
1101      83, -81,  82, -82,  84, -87, -86,  85, -11, -85,  86, -89,  87, -88,  88,  89}
1102 },{
1103     /* MapTab5 */
1104     2,  /* eob_sym */
1105     33, /* esc_sym */
1106     /* run table */
1107     {1,  1,  0,  2,  1,  2,  1,  3,  3,  1,  1,  4,  4,  2,  2,  1,
1108      1,  5,  5,  6,  1,  6,  1,  7,  7,  3,  3,  2,  8,  2,  8,  1,
1109      1,  0,  9,  9,  1,  1, 10,  4, 10,  4, 11, 11,  2,  1,  2,  1,
1110     12, 12,  3,  3,  1,  1, 13,  5,  5, 13, 14,  1,  1, 14,  2,  2,
1111      6,  6, 15,  1,  1, 15, 16,  4,  7, 16,  4,  7,  1,  1,  3,  3,
1112      8,  8,  2,  2,  1,  1, 17, 17,  1,  1, 18, 18,  5,  5,  2,  2,
1113      1,  1,  9, 19,  9, 19, 20,  3,  3, 20,  1, 10, 21,  1, 10,  4,
1114      4, 21, 22,  6,  6, 22,  1,  1, 23, 24,  2,  2, 23, 24, 11,  1,
1115      1, 11,  7, 25,  7,  1,  1, 25,  8,  8,  3, 26,  3,  1, 12,  2,
1116      2, 26,  1, 12,  5,  5, 27,  4,  1,  4,  1, 27, 28,  1, 28, 13,
1117      1, 13,  2, 29,  2,  1, 32,  6,  1, 30, 14, 29, 14,  6,  3, 31,
1118      3,  1, 30,  1, 32, 31, 33,  9, 33,  1,  1,  7,  9,  7,  2,  2,
1119      1,  1,  4, 36, 34,  4,  5, 10, 10,  5, 34,  1,  1, 35,  8,  8,
1120     36,  3, 35,  1, 15,  3,  2,  1, 16, 15, 16,  2, 37,  1, 37,  1,
1121      1,  1,  6,  6, 38,  1, 38, 11,  1, 39, 39, 40, 11,  2, 41,  4,
1122     40,  1,  2,  4,  1,  1,  1, 41,  3,  1,  3,  1,  5,  7,  5,  7},
1123
1124     /* value table */
1125     { 1,  -1,   0,   1,   2,  -1,  -2,   1,  -1,   3,  -3,   1,  -1,   2,  -2,   4,
1126      -4,   1,  -1,   1,   5,  -1,  -5,   1,  -1,   2,  -2,   3,   1,  -3,  -1,   6,
1127      -6,   0,   1,  -1,   7,  -7,   1,   2,  -1,  -2,   1,  -1,   4,   8,  -4,  -8,
1128       1,  -1,   3,  -3,   9,  -9,   1,   2,  -2,  -1,   1,  10, -10,  -1,   5,  -5,
1129       2,  -2,   1,  11, -11,  -1,   1,   3,   2,  -1,  -3,  -2,  12, -12,   4,  -4,
1130       2,  -2,  -6,   6,  13, -13,   1,  -1,  14, -14,   1,  -1,   3,  -3,   7,  -7,
1131      15, -15,   2,   1,  -2,  -1,   1,   5,  -5,  -1, -16,   2,   1,  16,  -2,   4,
1132      -4,  -1,   1,   3,  -3,  -1,  17, -17,   1,   1,  -8,   8,  -1,  -1,   2,  18,
1133     -18,  -2,   3,   1,  -3,  19, -19,  -1,   3,  -3,   6,   1,  -6,  20,   2,   9,
1134      -9,  -1, -20,  -2,   4,  -4,   1,  -5,  21,   5, -21,  -1,   1, -22,  -1,   2,
1135      22,  -2,  10,   1, -10,  23,   1,   4, -23,   1,   2,  -1,  -2,  -4,  -7,   1,
1136       7, -24,  -1,  24,  -1,  -1,   1,   3,  -1, -25,  25,   4,  -3,  -4,  11, -11,
1137      26, -26,   6,   1,   1,  -6,  -5,  -3,   3,   5,  -1, -27,  27,   1,   4,  -4,
1138      -1,  -8,  -1,  28,   2,   8, -12, -28,  -2,  -2,   2,  12,  -1,  29,   1, -29,
1139      30, -30,   5,  -5,   1, -31,  -1,   3,  31,  -1,   1,   1,  -3, -13,   1,  -7,
1140      -1, -32,  13,   7,  32,  33, -33,  -1,  -9, -34,   9,  34,  -6,   5,   6,  -5}
1141 },{
1142     /* MapTab6 */
1143     2,  /* eob_sym */
1144     13, /* esc_sym */
1145     /* run table */
1146     {1,  1,  0,  1,  1,  2,  2,  1,  1,  3,  3,  1,  1,  0,  2,  2,
1147      4,  1,  4,  1,  1,  1,  5,  5,  1,  1,  6,  6,  2,  2,  1,  1,
1148      3,  3,  7,  7,  1,  1,  8,  8,  1,  1,  2,  2,  1,  9,  1,  9,
1149      4,  4, 10,  1,  1, 10,  1,  1, 11, 11,  3,  3,  1,  2,  1,  2,
1150      1,  1, 12, 12,  5,  5,  1,  1, 13,  1,  1, 13,  2,  2,  1,  1,
1151      6,  6,  1,  1,  4, 14,  4, 14,  3,  1,  3,  1,  1,  1, 15,  7,
1152     15,  2,  2,  7,  1,  1,  1,  8,  1,  8, 16, 16,  1,  1,  1,  1,
1153      2,  1,  1,  2,  1,  1,  3,  5,  5,  3,  4,  1,  1,  4,  1,  1,
1154     17, 17,  9,  1,  1,  9,  2,  2,  1,  1, 10, 10,  1,  6,  1,  1,
1155      6, 18,  1,  1, 18,  1,  1,  1,  2,  2,  3,  1,  3,  1,  1,  1,
1156      4,  1, 19,  1, 19,  7,  1,  1, 20,  1,  4, 20,  1,  7, 11,  2,
1157      1, 11, 21,  2,  8,  5,  1,  8,  1,  5, 21,  1,  1,  1, 22,  1,
1158      1, 22,  1,  1,  3,  3,  1, 23,  2, 12, 24,  1,  1,  2,  1,  1,
1159     12, 23,  1,  1, 24,  1,  1,  1,  4,  1,  1,  1,  2,  1,  6,  6,
1160      4,  2,  1,  1,  1,  1,  1,  1,  1, 14, 13,  3,  1, 25,  9, 25,
1161     14,  1,  9,  3, 13,  1,  1,  1,  1,  1, 10,  1,  1,  2, 10,  2},
1162
1163     /* value table */
1164     {-20,  -1,   0,   2,  -2,   1,  -1,   3,  -3,   1,  -1,   4,  -4,   0,   2,  -2,
1165        1,   5,  -1,  -5,   6,  -6,   1,  -1,   7,  -7,   1,  -1,   3,  -3,   8,  -8,
1166        2,  -2,   1,  -1,   9,  -9,   1,  -1,  10, -10,   4,  -4,  11,   1, -11,  -1,
1167        2,  -2,   1,  12, -12,  -1,  13, -13,   1,  -1,   3,  -3,  14,   5, -14,  -5,
1168      -15,  15,  -1,   1,   2,  -2,  16, -16,   1,  17, -17,  -1,   6,  -6,  18, -18,
1169        2,  -2, -19,  19,  -3,   1,   3,  -1,   4,  20,  -4,   1, -21,  21,   1,   2,
1170       -1,  -7,   7,  -2,  22, -22,  23,   2, -23,  -2,   1,  -1, -24,  24, -25,  25,
1171       -8, -26,  26,   8, -27,  27,   5,   3,  -3,  -5,  -4,  28, -28,   4,  29, -29,
1172        1,  -1,  -2, -30,  30,   2,   9,  -9, -31,  31,   2,  -2, -32,   3,  32, -33,
1173       -3,   1,  33, -34,  -1,  34, -35,  35, -10,  10,  -6,  36,   6, -36,  37, -37,
1174       -5,  38,   1, -38,  -1,   3,  39, -39,  -1,  40,   5,   1, -40,  -3,   2, -11,
1175      -41,  -2,   1,  11,  -3,  -4,  41,   3,  42,   4,  -1, -43, -42,  43,   1, -44,
1176       45,  -1,  44, -45,  -7,   7, -46,   1, -12,   2,   1, -47,  46,  12,  47,  48,
1177       -2,  -1, -48,  49,  -1, -50, -49,  50,  -6, -51,  51,  52, -13,  53,  -4,   4,
1178        6,  13, -53, -52, -54,  55,  54, -55, -56,  -2,   2,  -8,  56,   1,  -3,  -1,
1179        2,  58,   3,   8,  -2,  57, -58, -60, -59, -57,  -3,  60,  59, -14,   3,  14}
1180 },{
1181     /* MapTab7 */
1182     2,  /* eob_sym */
1183     38, /* esc_sym */
1184     /* run table */
1185     {1,  1,  0,  2,  2,  1,  1,  3,  3,  4,  4,  5,  5,  1,  1,  6,
1186      6,  2,  2,  7,  7,  8,  8,  1,  1,  3,  3,  9,  9, 10, 10,  1,
1187      1,  2,  2,  4,  4, 11,  0, 11, 12, 12, 13, 13,  1,  1,  5,  5,
1188     14, 14, 15, 16, 15, 16,  3,  3,  1,  6,  1,  6,  2,  2,  7,  7,
1189      8,  8, 17, 17,  1,  1,  4,  4, 18, 18,  2,  2,  1, 19,  1, 20,
1190     19, 20, 21, 21,  3,  3, 22, 22,  5,  5, 24,  1,  1, 23,  9, 23,
1191     24,  9,  2,  2, 10,  1,  1, 10,  6,  6, 25,  4,  4, 25,  7,  7,
1192     26,  8,  1,  8,  3,  1, 26,  3, 11, 11, 27, 27,  2, 28,  1,  2,
1193     28,  1, 12, 12,  5,  5, 29, 13, 13, 29, 32,  1,  1, 33, 31, 30,
1194     32,  4, 30, 33,  4, 31,  3, 14,  1,  1,  3, 34, 34,  2,  2, 14,
1195      6,  6, 35, 36, 35, 36,  1, 15,  1, 16, 16, 15,  7,  9,  7,  9,
1196     37,  8,  8, 37,  1,  1, 39,  2, 38, 39,  2, 40,  5, 38, 40,  5,
1197      3,  3,  4,  4, 10, 10,  1,  1,  1,  1, 41,  2, 41,  2,  6,  6,
1198      1,  1, 11, 42, 11, 43,  3, 42,  3, 17,  4, 43,  1, 17,  7,  1,
1199      8, 44,  4,  7, 44,  5,  8,  2,  5,  1,  2, 48, 45,  1, 12, 45,
1200     12, 48, 13, 13,  1,  9,  9, 46,  1, 46, 47, 47, 49, 18, 18, 49},
1201
1202     /* value table */
1203     { 1,  -1,   0,   1,  -1,   2,  -2,   1,  -1,   1,  -1,   1,  -1,   3,  -3,   1,
1204      -1,  -2,   2,   1,  -1,   1,  -1,   4,  -4,  -2,   2,   1,  -1,   1,  -1,   5,
1205      -5,  -3,   3,   2,  -2,   1,   0,  -1,   1,  -1,   1,  -1,   6,  -6,   2,  -2,
1206       1,  -1,   1,   1,  -1,  -1,  -3,   3,   7,   2,  -7,  -2,  -4,   4,   2,  -2,
1207       2,  -2,   1,  -1,   8,  -8,   3,  -3,   1,  -1,  -5,   5,   9,   1,  -9,   1,
1208      -1,  -1,   1,  -1,  -4,   4,   1,  -1,   3,  -3,   1, -10,  10,   1,   2,  -1,
1209      -1,  -2,   6,  -6,   2,  11, -11,  -2,   3,  -3,   1,  -4,   4,  -1,   3,  -3,
1210       1,   3,  12,  -3,  -5, -12,  -1,   5,   2,  -2,   1,  -1,  -7,   1,  13,   7,
1211      -1, -13,   2,  -2,   4,  -4,   1,   2,  -2,  -1,   1,  14, -14,   1,   1,   1,
1212      -1,  -5,  -1,  -1,   5,  -1,  -6,   2, -15,  15,   6,   1,  -1,  -8,   8,  -2,
1213      -4,   4,   1,   1,  -1,  -1,  16,   2, -16,  -2,   2,  -2,   4,   3,  -4,  -3,
1214      -1,  -4,   4,   1, -17,  17,  -1,  -9,   1,   1,   9,   1,  -5,  -1,  -1,   5,
1215      -7,   7,   6,  -6,   3,  -3,  18, -18,  19, -19,   1, -10,  -1,  10,  -5,   5,
1216      20, -20,  -3,   1,   3,   1,   8,  -1,  -8,   2,   7,  -1, -21,  -2,   5,  21,
1217       5,  -1,  -7,  -5,   1,  -6,  -5, -11,   6,  22,  11,   1,   1, -22,  -3,  -1,
1218       3,  -1,   3,  -3, -23,   4,  -4,   1,  23,  -1,   1,  -1,   1,  -2,   2,  -1}
1219 },{
1220     /* MapTab8 */
1221     4,  /* eob_sym */
1222     11, /* esc_sym */
1223     /* run table */
1224     {1,  1,  1,  1,  0,  2,  2,  1,  1,  3,  3,  0,  1,  1,  2,  2,
1225      4,  4,  1,  1,  5,  5,  1,  1,  2,  2,  3,  3,  6,  6,  1,  1,
1226      7,  7,  8,  1,  8,  2,  2,  1,  4,  4,  1,  3,  1,  3,  9,  9,
1227      2,  2,  1,  5,  1,  5, 10, 10,  1,  1, 11, 11,  3,  6,  3,  4,
1228      4,  6,  2,  2,  1, 12,  1, 12,  7, 13,  7, 13,  1,  1,  8,  8,
1229      2,  2, 14, 14, 16, 15, 16,  5,  5,  1,  3, 15,  1,  3,  4,  4,
1230      1,  1, 17, 17,  2,  2,  6,  6,  1, 18,  1, 18, 22, 21, 22, 21,
1231     25, 24, 25, 19,  9, 20,  9, 23, 19, 24, 20,  3, 23,  7,  3,  1,
1232      1,  7, 28, 26, 29,  5, 28, 26,  5,  8, 29,  4,  8, 27,  2,  2,
1233      4, 27,  1,  1, 10, 36, 10, 33, 33, 36, 30,  1, 32, 32,  1, 30,
1234      6, 31, 31, 35,  3,  6, 11, 11,  3,  2, 35,  2, 34,  1, 34,  1,
1235     37, 37, 12,  7, 12,  5, 41,  5,  4,  7,  1,  8, 13,  4,  1, 41,
1236     13, 38,  8, 38,  9,  1, 40, 40,  9,  1, 39,  2,  2, 49, 39, 42,
1237      3,  3, 14, 16, 49, 14, 16, 42, 43, 43,  6,  6, 15,  1,  1, 15,
1238     44, 44,  1,  1, 50, 48,  4,  5,  4,  7,  5,  2, 10, 10, 48,  7,
1239     50, 45,  2,  1, 45,  8,  8,  1, 46, 46,  3, 47, 47,  3,  1,  1},
1240
1241     /* value table */
1242     { 1,  -1,   2,  -2,   0,   1,  -1,   3,  -3,   1,  -1,   0,   4,  -4,   2,  -2,
1243       1,  -1,   5,  -5,   1,  -1,   6,  -6,   3,  -3,   2,  -2,   1,  -1,   7,  -7,
1244       1,  -1,   1,   8,  -1,   4,  -4,  -8,   2,  -2,   9,   3,  -9,  -3,   1,  -1,
1245       5,  -5,  10,   2, -10,  -2,   1,  -1,  11, -11,   1,  -1,  -4,   2,   4,   3,
1246      -3,  -2,   6,  -6,  12,   1, -12,  -1,   2,   1,  -2,  -1,  13, -13,   2,  -2,
1247       7,  -7,   1,  -1,   1,   1,  -1,   3,  -3,  14,   5,  -1, -14,  -5,   4,  -4,
1248      15, -15,   1,  -1,   8,  -8,  -3,   3,  16,   1, -16,  -1,   1,   1,  -1,  -1,
1249       1,   1,  -1,   1,   2,   1,  -2,   1,  -1,  -1,  -1,   6,  -1,   3,  -6,  17,
1250     -17,  -3,   1,   1,   1,   4,  -1,  -1,  -4,   3,  -1,   5,  -3,  -1,  -9,   9,
1251      -5,   1,  18, -18,   2,   1,  -2,   1,  -1,  -1,   1,  19,  -1,   1, -19,  -1,
1252       4,   1,  -1,   1,   7,  -4,  -2,   2,  -7,  10,  -1, -10,   1,  20,  -1, -20,
1253       1,  -1,   2,   4,  -2,   5,   1,  -5,   6,  -4,  21,   4,   2,  -6, -21,  -1,
1254      -2,   1,  -4,  -1,  -3,  22,  -1,   1,   3, -22,  -1,  11, -11,   1,   1,   1,
1255       8,  -8,   2,   2,  -1,  -2,  -2,  -1,   1,  -1,  -5,   5,   2,  23, -23,  -2,
1256       1,  -1,  24, -24,  -1,  -1,   7,   6,  -7,   5,  -6,  12,  -3,   3,   1,  -5,
1257       1,   1, -12,  25,  -1,  -5,   5, -25,  -1,   1,   9,   1,  -1,  -9,  26, -26}
1258 }
1259 };