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