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