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 FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * This file contains functions and data shared by both Indeo4 and
26  * Indeo5 decoders.
27  */
28 
29 #define BITSTREAM_READER_LE
30 #include "libavutil/attributes.h"
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "internal.h"
34 #include "mathops.h"
35 #include "ivi_common.h"
36 #include "ivi_dsp.h"
37 
38 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables
39 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables
40 
41 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
42 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
43 
44 /**
45  * Reverse "nbits" bits of the value "val" and return the result
46  * in the least significant bits.
47  */
48 static uint16_t inv_bits(uint16_t val, int nbits)
49 {
50  uint16_t res;
51 
52  if (nbits <= 8) {
53  res = ff_reverse[val] >> (8-nbits);
54  } else
55  res = ((ff_reverse[val & 0xFF] << 8) + (ff_reverse[val >> 8])) >> (16-nbits);
56 
57  return res;
58 }
59 
60 /*
61  * Generate a huffman codebook from the given descriptor
62  * and convert it into the FFmpeg VLC table.
63  *
64  * @param[in] cb pointer to codebook descriptor
65  * @param[out] vlc where to place the generated VLC table
66  * @param[in] flag flag: 1 - for static or 0 for dynamic tables
67  * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
68  */
69 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
70 {
71  int pos, i, j, codes_per_row, prefix, not_last_row;
72  uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
73  uint8_t bits[256];
74 
75  pos = 0; /* current position = 0 */
76 
77  for (i = 0; i < cb->num_rows; i++) {
78  codes_per_row = 1 << cb->xbits[i];
79  not_last_row = (i != cb->num_rows - 1);
80  prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
81 
82  for (j = 0; j < codes_per_row; j++) {
83  if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
84  break; /* elements, but only 256 codes are allowed! */
85 
86  bits[pos] = i + cb->xbits[i] + not_last_row;
87  if (bits[pos] > IVI_VLC_BITS)
88  return -1; /* invalid descriptor */
89 
90  codewords[pos] = inv_bits((prefix | j), bits[pos]);
91  if (!bits[pos])
92  bits[pos] = 1;
93 
94  pos++;
95  }//for j
96  }//for i
97 
98  /* number of codewords = pos */
99  return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
100  (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
101 }
102 
104 {
105  int i;
106  static VLC_TYPE table_data[8192 * 16][2];
107  static int initialized_vlcs = 0;
108 
109  if (initialized_vlcs)
110  return;
111  for (i = 0; i < 8; i++) {
112  ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
113  ivi_mb_vlc_tabs[i].table_allocated = 8192;
114  ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ivi_mb_vlc_tabs[i], 1);
115  ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
116  ivi_blk_vlc_tabs[i].table_allocated = 8192;
117  ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ivi_blk_vlc_tabs[i], 1);
118  }
119  initialized_vlcs = 1;
120 }
121 
122 /*
123  * Copy huffman codebook descriptors.
124  *
125  * @param[out] dst ptr to the destination descriptor
126  * @param[in] src ptr to the source descriptor
127  */
129 {
130  dst->num_rows = src->num_rows;
131  memcpy(dst->xbits, src->xbits, src->num_rows);
132 }
133 
134 /*
135  * Compare two huffman codebook descriptors.
136  *
137  * @param[in] desc1 ptr to the 1st descriptor to compare
138  * @param[in] desc2 ptr to the 2nd descriptor to compare
139  * @return comparison result: 0 - equal, 1 - not equal
140  */
141 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
142 {
143  return desc1->num_rows != desc2->num_rows
144  || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
145 }
146 
147 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
148  IVIHuffTab *huff_tab, AVCodecContext *avctx)
149 {
150  int i, result;
151  IVIHuffDesc new_huff;
152 
153  if (!desc_coded) {
154  /* select default table */
155  huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
156  : &ivi_mb_vlc_tabs [7];
157  } else {
158  huff_tab->tab_sel = get_bits(gb, 3);
159  if (huff_tab->tab_sel == 7) {
160  /* custom huffman table (explicitly encoded) */
161  new_huff.num_rows = get_bits(gb, 4);
162  if (!new_huff.num_rows) {
163  av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
164  return AVERROR_INVALIDDATA;
165  }
166 
167  for (i = 0; i < new_huff.num_rows; i++)
168  new_huff.xbits[i] = get_bits(gb, 4);
169 
170  /* Have we got the same custom table? Rebuild if not. */
171  if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
172  ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
173 
174  if (huff_tab->cust_tab.table)
175  ff_free_vlc(&huff_tab->cust_tab);
176  result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
177  &huff_tab->cust_tab, 0);
178  if (result) {
179  huff_tab->cust_desc.num_rows = 0; // reset faulty description
180  av_log(avctx, AV_LOG_ERROR,
181  "Error while initializing custom vlc table!\n");
182  return result;
183  }
184  }
185  huff_tab->tab = &huff_tab->cust_tab;
186  } else {
187  /* select one of predefined tables */
188  huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
189  : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
190  }
191  }
192 
193  return 0;
194 }
195 
196 /*
197  * Free planes, bands and macroblocks buffers.
198  *
199  * @param[in] planes pointer to the array of the plane descriptors
200  */
202 {
203  int p, b, t;
204 
205  for (p = 0; p < 3; p++) {
206  if (planes[p].bands)
207  for (b = 0; b < planes[p].num_bands; b++) {
208  av_freep(&planes[p].bands[b].bufs[0]);
209  av_freep(&planes[p].bands[b].bufs[1]);
210  av_freep(&planes[p].bands[b].bufs[2]);
211 
212  if (planes[p].bands[b].blk_vlc.cust_tab.table)
213  ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
214  for (t = 0; t < planes[p].bands[b].num_tiles; t++)
215  av_freep(&planes[p].bands[b].tiles[t].mbs);
216  av_freep(&planes[p].bands[b].tiles);
217  }
218  av_freep(&planes[p].bands);
219  }
220 }
221 
223 {
224  int p, b;
225  uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
226  IVIBandDesc *band;
227 
228  ivi_free_buffers(planes);
229 
230  /* fill in the descriptor of the luminance plane */
231  planes[0].width = cfg->pic_width;
232  planes[0].height = cfg->pic_height;
233  planes[0].num_bands = cfg->luma_bands;
234 
235  /* fill in the descriptors of the chrominance planes */
236  planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
237  planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
238  planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
239 
240  for (p = 0; p < 3; p++) {
241  planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
242  if (!planes[p].bands)
243  return AVERROR(ENOMEM);
244 
245  /* select band dimensions: if there is only one band then it
246  * has the full size, if there are several bands each of them
247  * has only half size */
248  b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
249  b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
250 
251  /* luma band buffers will be aligned on 16x16 (max macroblock size) */
252  /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
253  align_fac = p ? 8 : 16;
254  width_aligned = FFALIGN(b_width , align_fac);
255  height_aligned = FFALIGN(b_height, align_fac);
256  buf_size = width_aligned * height_aligned * sizeof(int16_t);
257 
258  for (b = 0; b < planes[p].num_bands; b++) {
259  band = &planes[p].bands[b]; /* select appropriate plane/band */
260  band->plane = p;
261  band->band_num = b;
262  band->width = b_width;
263  band->height = b_height;
264  band->pitch = width_aligned;
265  band->aheight = height_aligned;
266  band->bufs[0] = av_mallocz(buf_size);
267  band->bufs[1] = av_mallocz(buf_size);
268  band->bufsize = buf_size/2;
269  if (!band->bufs[0] || !band->bufs[1])
270  return AVERROR(ENOMEM);
271 
272  /* allocate the 3rd band buffer for scalability mode */
273  if (cfg->luma_bands > 1) {
274  band->bufs[2] = av_mallocz(buf_size);
275  if (!band->bufs[2])
276  return AVERROR(ENOMEM);
277  }
278 
279  planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */
280  }
281  }
282 
283  return 0;
284 }
285 
286 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
287 {
288  int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
289  IVIBandDesc *band;
290  IVITile *tile, *ref_tile;
291 
292  for (p = 0; p < 3; p++) {
293  t_width = !p ? tile_width : (tile_width + 3) >> 2;
294  t_height = !p ? tile_height : (tile_height + 3) >> 2;
295 
296  if (!p && planes[0].num_bands == 4) {
297  t_width >>= 1;
298  t_height >>= 1;
299  }
300  if(t_width<=0 || t_height<=0)
301  return AVERROR(EINVAL);
302 
303  for (b = 0; b < planes[p].num_bands; b++) {
304  band = &planes[p].bands[b];
305  x_tiles = IVI_NUM_TILES(band->width, t_width);
306  y_tiles = IVI_NUM_TILES(band->height, t_height);
307  band->num_tiles = x_tiles * y_tiles;
308 
309  av_freep(&band->tiles);
310  band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
311  if (!band->tiles)
312  return AVERROR(ENOMEM);
313 
314  tile = band->tiles;
315 
316  /* use the first luma band as reference for motion vectors
317  * and quant */
318  ref_tile = planes[0].bands[0].tiles;
319 
320  for (y = 0; y < band->height; y += t_height) {
321  for (x = 0; x < band->width; x += t_width) {
322  tile->xpos = x;
323  tile->ypos = y;
324  tile->mb_size = band->mb_size;
325  tile->width = FFMIN(band->width - x, t_width);
326  tile->height = FFMIN(band->height - y, t_height);
327  tile->is_empty = tile->data_size = 0;
328  /* calculate number of macroblocks */
329  tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
330  band->mb_size);
331 
332  av_freep(&tile->mbs);
333  tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
334  if (!tile->mbs)
335  return AVERROR(ENOMEM);
336 
337  tile->ref_mbs = 0;
338  if (p || b) {
339  if (tile->num_MBs <= ref_tile->num_MBs) {
340  tile->ref_mbs = ref_tile->mbs;
341  }else
342  av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
343  ref_tile++;
344  }
345 
346  tile++;
347  }
348  }
349 
350  }// for b
351  }// for p
352 
353  return 0;
354 }
355 
356 /*
357  * Decode size of the tile data.
358  * The size is stored as a variable-length field having the following format:
359  * if (tile_data_size < 255) than this field is only one byte long
360  * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
361  * where X1-X3 is size of the tile data
362  *
363  * @param[in,out] gb the GetBit context
364  * @return size of the tile data in bytes
365  */
367 {
368  int len;
369 
370  len = 0;
371  if (get_bits1(gb)) {
372  len = get_bits(gb, 8);
373  if (len == 255)
374  len = get_bits_long(gb, 24);
375  }
376 
377  /* align the bitstream reader on the byte boundary */
378  align_get_bits(gb);
379 
380  return len;
381 }
382 
383 /*
384  * Decode block data:
385  * extract huffman-coded transform coefficients from the bitstream,
386  * dequantize them, apply inverse transform and motion compensation
387  * in order to reconstruct the picture.
388  *
389  * @param[in,out] gb the GetBit context
390  * @param[in] band pointer to the band descriptor
391  * @param[in] tile pointer to the tile descriptor
392  * @return result code: 0 - OK, -1 = error (corrupted blocks data)
393  */
395  AVCodecContext *avctx)
396 {
397  int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
398  pos, is_intra, mc_type = 0, av_uninit(mv_x), av_uninit(mv_y), col_mask;
399  uint8_t col_flags[8];
400  int32_t prev_dc, trvec[64];
401  uint32_t cbp, av_uninit(sym), lo, hi, quant, buf_offs, q;
402  IVIMbInfo *mb;
403  RVMapDesc *rvmap = band->rv_map;
404  void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
405  void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
406  const uint16_t *base_tab;
407  const uint8_t *scale_tab;
408 
409  prev_dc = 0; /* init intra prediction for the DC coefficient */
410 
411  blk_size = band->blk_size;
412  col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */
413  num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */
414  num_coeffs = blk_size * blk_size;
415  if (blk_size == 8) {
416  mc_with_delta_func = ff_ivi_mc_8x8_delta;
417  mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
418  } else {
419  mc_with_delta_func = ff_ivi_mc_4x4_delta;
420  mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
421  }
422 
423  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
424  is_intra = !mb->type;
425  cbp = mb->cbp;
426  buf_offs = mb->buf_offs;
427 
428  quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
429 
430  base_tab = is_intra ? band->intra_base : band->inter_base;
431  scale_tab = is_intra ? band->intra_scale : band->inter_scale;
432  if (scale_tab)
433  quant = scale_tab[quant];
434 
435  if (!is_intra) {
436  mv_x = mb->mv_x;
437  mv_y = mb->mv_y;
438  if (band->is_halfpel) {
439  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
440  mv_x >>= 1;
441  mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
442  }
443  if (mb->type) {
444  int dmv_x, dmv_y, cx, cy;
445 
446  dmv_x = mb->mv_x >> band->is_halfpel;
447  dmv_y = mb->mv_y >> band->is_halfpel;
448  cx = mb->mv_x & band->is_halfpel;
449  cy = mb->mv_y & band->is_halfpel;
450 
451  if ( mb->xpos + dmv_x < 0
452  || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
453  || mb->ypos + dmv_y < 0
454  || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
455  return AVERROR_INVALIDDATA;
456  }
457  }
458  }
459 
460  for (blk = 0; blk < num_blocks; blk++) {
461  /* adjust block position in the buffer according to its number */
462  if (blk & 1) {
463  buf_offs += blk_size;
464  } else if (blk == 2) {
465  buf_offs -= blk_size;
466  buf_offs += blk_size * band->pitch;
467  }
468 
469  if (cbp & 1) { /* block coded ? */
470  if (!band->scan) {
471  av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
472  return AVERROR_INVALIDDATA;
473  }
474 
475  scan_pos = -1;
476  memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */
477  memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */
478 
479  while (scan_pos <= num_coeffs) {
480  sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
481  if (sym == rvmap->eob_sym)
482  break; /* End of block */
483 
484  if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */
485  run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
486  lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
487  hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
488  val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */
489  } else {
490  if (sym >= 256U) {
491  av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
492  return -1;
493  }
494  run = rvmap->runtab[sym];
495  val = rvmap->valtab[sym];
496  }
497 
498  /* de-zigzag and dequantize */
499  scan_pos += run;
500  if (scan_pos >= (unsigned)num_coeffs)
501  break;
502  pos = band->scan[scan_pos];
503 
504  if (!val)
505  av_dlog(avctx, "Val = 0 encountered!\n");
506 
507  q = (base_tab[pos] * quant) >> 9;
508  if (q > 1)
509  val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
510  trvec[pos] = val;
511  col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */
512  }// while
513 
514  if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
515  return -1; /* corrupt block data */
516 
517  /* undoing DC coeff prediction for intra-blocks */
518  if (is_intra && band->is_2d_trans) {
519  prev_dc += trvec[0];
520  trvec[0] = prev_dc;
521  col_flags[0] |= !!prev_dc;
522  }
523  if(band->transform_size > band->blk_size){
524  av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
525  return AVERROR_INVALIDDATA;
526  }
527  /* apply inverse transform */
528  band->inv_transform(trvec, band->buf + buf_offs,
529  band->pitch, col_flags);
530 
531  /* apply motion compensation */
532  if (!is_intra)
533  mc_with_delta_func(band->buf + buf_offs,
534  band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
535  band->pitch, mc_type);
536  } else {
537  /* block not coded */
538  /* for intra blocks apply the dc slant transform */
539  /* for inter - perform the motion compensation without delta */
540  if (is_intra) {
541  band->dc_transform(&prev_dc, band->buf + buf_offs,
542  band->pitch, blk_size);
543  } else
544  mc_no_delta_func(band->buf + buf_offs,
545  band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
546  band->pitch, mc_type);
547  }
548 
549  cbp >>= 1;
550  }// for blk
551  }// for mbn
552 
553  align_get_bits(gb);
554 
555  return 0;
556 }
557 
558 /**
559  * Handle empty tiles by performing data copying and motion
560  * compensation respectively.
561  *
562  * @param[in] avctx ptr to the AVCodecContext
563  * @param[in] band pointer to the band descriptor
564  * @param[in] tile pointer to the tile descriptor
565  * @param[in] mv_scale scaling factor for motion vectors
566  */
568  IVITile *tile, int32_t mv_scale)
569 {
570  int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
571  int offs, mb_offset, row_offset;
572  IVIMbInfo *mb, *ref_mb;
573  const int16_t *src;
574  int16_t *dst;
575  void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
576  int mc_type);
577 
578  if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
579  av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
580  "parameters %d in ivi_process_empty_tile()\n",
581  tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
582  return AVERROR_INVALIDDATA;
583  }
584 
585  offs = tile->ypos * band->pitch + tile->xpos;
586  mb = tile->mbs;
587  ref_mb = tile->ref_mbs;
588  row_offset = band->mb_size * band->pitch;
589  need_mc = 0; /* reset the mc tracking flag */
590 
591  for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
592  mb_offset = offs;
593 
594  for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
595  mb->xpos = x;
596  mb->ypos = y;
597  mb->buf_offs = mb_offset;
598 
599  mb->type = 1; /* set the macroblocks type = INTER */
600  mb->cbp = 0; /* all blocks are empty */
601 
602  if (!band->qdelta_present && !band->plane && !band->band_num) {
603  mb->q_delta = band->glob_quant;
604  mb->mv_x = 0;
605  mb->mv_y = 0;
606  }
607 
608  if (band->inherit_qdelta && ref_mb)
609  mb->q_delta = ref_mb->q_delta;
610 
611  if (band->inherit_mv && ref_mb) {
612  /* motion vector inheritance */
613  if (mv_scale) {
614  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
615  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
616  } else {
617  mb->mv_x = ref_mb->mv_x;
618  mb->mv_y = ref_mb->mv_y;
619  }
620  need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
621  {
622  int dmv_x, dmv_y, cx, cy;
623 
624  dmv_x = mb->mv_x >> band->is_halfpel;
625  dmv_y = mb->mv_y >> band->is_halfpel;
626  cx = mb->mv_x & band->is_halfpel;
627  cy = mb->mv_y & band->is_halfpel;
628 
629  if ( mb->xpos + dmv_x < 0
630  || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
631  || mb->ypos + dmv_y < 0
632  || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
633  av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
634  return AVERROR_INVALIDDATA;
635  }
636  }
637  }
638 
639  mb++;
640  if (ref_mb)
641  ref_mb++;
642  mb_offset += band->mb_size;
643  } // for x
644  offs += row_offset;
645  } // for y
646 
647  if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
648  num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
649  mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
651 
652  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
653  mv_x = mb->mv_x;
654  mv_y = mb->mv_y;
655  if (!band->is_halfpel) {
656  mc_type = 0; /* we have only fullpel vectors */
657  } else {
658  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
659  mv_x >>= 1;
660  mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
661  }
662 
663  for (blk = 0; blk < num_blocks; blk++) {
664  /* adjust block position in the buffer according with its number */
665  offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
666  mc_no_delta_func(band->buf + offs,
667  band->ref_buf + offs + mv_y * band->pitch + mv_x,
668  band->pitch, mc_type);
669  }
670  }
671  } else {
672  /* copy data from the reference tile into the current one */
673  src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
674  dst = band->buf + tile->ypos * band->pitch + tile->xpos;
675  for (y = 0; y < tile->height; y++) {
676  memcpy(dst, src, tile->width*sizeof(band->buf[0]));
677  src += band->pitch;
678  dst += band->pitch;
679  }
680  }
681 
682  return 0;
683 }
684 
685 
686 #ifdef DEBUG
687 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
688 {
689  int x, y;
690  int16_t *src, checksum;
691 
692  src = band->buf;
693  checksum = 0;
694 
695  for (y = 0; y < band->height; src += band->pitch, y++)
696  for (x = 0; x < band->width; x++)
697  checksum += src[x];
698 
699  return checksum;
700 }
701 #endif
702 
703 /*
704  * Convert and output the current plane.
705  * This conversion is done by adding back the bias value of 128
706  * (subtracted in the encoder) and clipping the result.
707  *
708  * @param[in] plane pointer to the descriptor of the plane being processed
709  * @param[out] dst pointer to the buffer receiving converted pixels
710  * @param[in] dst_pitch pitch for moving to the next y line
711  */
713 {
714  int x, y;
715  const int16_t *src = plane->bands[0].buf;
716  uint32_t pitch = plane->bands[0].pitch;
717 
718  if (!src)
719  return;
720 
721  for (y = 0; y < plane->height; y++) {
722  for (x = 0; x < plane->width; x++)
723  dst[x] = av_clip_uint8(src[x] + 128);
724  src += pitch;
725  dst += dst_pitch;
726  }
727 }
728 
729 /**
730  * Decode an Indeo 4 or 5 band.
731  *
732  * @param[in,out] ctx ptr to the decoder context
733  * @param[in,out] band ptr to the band descriptor
734  * @param[in] avctx ptr to the AVCodecContext
735  * @return result code: 0 = OK, -1 = error
736  */
737 static int decode_band(IVI45DecContext *ctx,
738  IVIBandDesc *band, AVCodecContext *avctx)
739 {
740  int result, i, t, idx1, idx2, pos;
741  IVITile *tile;
742 
743  band->buf = band->bufs[ctx->dst_buf];
744  if (!band->buf) {
745  av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
746  return AVERROR_INVALIDDATA;
747  }
748  band->ref_buf = band->bufs[ctx->ref_buf];
749  band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
750 
751  result = ctx->decode_band_hdr(ctx, band, avctx);
752  if (result) {
753  av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
754  result);
755  return result;
756  }
757 
758  if (band->is_empty) {
759  av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
760  return AVERROR_INVALIDDATA;
761  }
762 
763  band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
764 
765  /* apply corrections to the selected rvmap table if present */
766  for (i = 0; i < band->num_corr; i++) {
767  idx1 = band->corr[i * 2];
768  idx2 = band->corr[i * 2 + 1];
769  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
770  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
771  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
772  band->rv_map->eob_sym ^= idx1 ^ idx2;
773  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
774  band->rv_map->esc_sym ^= idx1 ^ idx2;
775  }
776 
777  pos = get_bits_count(&ctx->gb);
778 
779  for (t = 0; t < band->num_tiles; t++) {
780  tile = &band->tiles[t];
781 
782  if (tile->mb_size != band->mb_size) {
783  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
784  band->mb_size, tile->mb_size);
785  return AVERROR_INVALIDDATA;
786  }
787  tile->is_empty = get_bits1(&ctx->gb);
788  if (tile->is_empty) {
789  result = ivi_process_empty_tile(avctx, band, tile,
790  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
791  if (result < 0)
792  break;
793  av_dlog(avctx, "Empty tile encountered!\n");
794  } else {
795  tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
796  if (!tile->data_size) {
797  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
798  result = AVERROR_INVALIDDATA;
799  break;
800  }
801 
802  result = ctx->decode_mb_info(ctx, band, tile, avctx);
803  if (result < 0)
804  break;
805 
806  result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
807  if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
808  av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
809  break;
810  }
811 
812  pos += tile->data_size << 3; // skip to next tile
813  }
814  }
815 
816  /* restore the selected rvmap table by applying its corrections in reverse order */
817  for (i = band->num_corr-1; i >= 0; i--) {
818  idx1 = band->corr[i*2];
819  idx2 = band->corr[i*2+1];
820  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
821  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
822  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
823  band->rv_map->eob_sym ^= idx1 ^ idx2;
824  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
825  band->rv_map->esc_sym ^= idx1 ^ idx2;
826  }
827 
828 #ifdef DEBUG
829  if (band->checksum_present) {
830  uint16_t chksum = ivi_calc_band_checksum(band);
831  if (chksum != band->checksum) {
832  av_log(avctx, AV_LOG_ERROR,
833  "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
834  band->plane, band->band_num, band->checksum, chksum);
835  }
836  }
837 #endif
838 
839  align_get_bits(&ctx->gb);
840 
841  return result;
842 }
843 
844 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
845  AVPacket *avpkt)
846 {
847  IVI45DecContext *ctx = avctx->priv_data;
848  const uint8_t *buf = avpkt->data;
849  AVFrame *frame = data;
850  int buf_size = avpkt->size;
851  int result, p, b;
852 
853  init_get_bits(&ctx->gb, buf, buf_size * 8);
854  ctx->frame_data = buf;
855  ctx->frame_size = buf_size;
856 
857  result = ctx->decode_pic_hdr(ctx, avctx);
858  if (result) {
859  av_log(avctx, AV_LOG_ERROR,
860  "Error while decoding picture header: %d\n", result);
861  return -1;
862  }
863  if (ctx->gop_invalid)
864  return AVERROR_INVALIDDATA;
865 
866  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
867  av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
868  return -1;
869  }
870 
871  ctx->switch_buffers(ctx);
872 
873  //{ START_TIMER;
874 
875  if (ctx->is_nonnull_frame(ctx)) {
876  ctx->buf_invalid[ctx->dst_buf] = 1;
877  for (p = 0; p < 3; p++) {
878  for (b = 0; b < ctx->planes[p].num_bands; b++) {
879  result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
880  if (result) {
881  av_log(avctx, AV_LOG_ERROR,
882  "Error while decoding band: %d, plane: %d\n", b, p);
883  return -1;
884  }
885  }
886  }
887  ctx->buf_invalid[ctx->dst_buf] = 0;
888  }
889  if (ctx->buf_invalid[ctx->dst_buf])
890  return -1;
891 
892  //STOP_TIMER("decode_planes"); }
893 
894  /* If the bidirectional mode is enabled, next I and the following P frame will */
895  /* be sent together. Unfortunately the approach below seems to be the only way */
896  /* to handle the B-frames mode. That's exactly the same Intel decoders do. */
897  if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) {
898  while (get_bits(&ctx->gb, 8)); // skip version string
899  skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment
900  if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
901  av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
902  }
903 
904  if (!ctx->is_nonnull_frame(ctx))
905  return buf_size;
906 
907  avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
908  if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
909  return result;
910 
911  if (ctx->is_scalable) {
912  if (avctx->codec_id == AV_CODEC_ID_INDEO4)
913  ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
914  else
915  ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
916  } else {
917  ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
918  }
919 
920  ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
921  ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
922 
923  *got_frame = 1;
924 
925  return buf_size;
926 }
927 
928 /**
929  * Close Indeo5 decoder and clean up its context.
930  */
932 {
933  IVI45DecContext *ctx = avctx->priv_data;
934 
935  ivi_free_buffers(&ctx->planes[0]);
936 
937  if (ctx->mb_vlc.cust_tab.table)
938  ff_free_vlc(&ctx->mb_vlc.cust_tab);
939 
940 #if IVI4_STREAM_ANALYSER
941  if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
942  if (ctx->is_scalable)
943  av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
944  if (ctx->uses_tiling)
945  av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
946  if (ctx->has_b_frames)
947  av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
948  if (ctx->has_transp)
949  av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
950  if (ctx->uses_haar)
951  av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
952  if (ctx->uses_fullpel)
953  av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
954  }
955 #endif
956 
957  return 0;
958 }
959 
960 
961 /**
962  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
963  * signals. They are specified using "huffman descriptors" in order to
964  * avoid huge static tables. The decoding tables will be generated at
965  * startup from these descriptors.
966  */
967 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
968  {8, {0, 4, 5, 4, 4, 4, 6, 6}},
969  {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
970  {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
971  {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
972  {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
973  {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
974  {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
975  {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
976 };
977 
978 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
979  {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
980  {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
981  {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
982  {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
983  {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
984  {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
985  {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
986  {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
987 };
988 
989 
990 /**
991  * Scan patterns shared between indeo4 and indeo5
992  */
994  0, 8, 16, 24, 32, 40, 48, 56,
995  1, 9, 17, 25, 33, 41, 49, 57,
996  2, 10, 18, 26, 34, 42, 50, 58,
997  3, 11, 19, 27, 35, 43, 51, 59,
998  4, 12, 20, 28, 36, 44, 52, 60,
999  5, 13, 21, 29, 37, 45, 53, 61,
1000  6, 14, 22, 30, 38, 46, 54, 62,
1001  7, 15, 23, 31, 39, 47, 55, 63
1002 };
1003 
1005  0, 1, 2, 3, 4, 5, 6, 7,
1006  8, 9, 10, 11, 12, 13, 14, 15,
1007  16, 17, 18, 19, 20, 21, 22, 23,
1008  24, 25, 26, 27, 28, 29, 30, 31,
1009  32, 33, 34, 35, 36, 37, 38, 39,
1010  40, 41, 42, 43, 44, 45, 46, 47,
1011  48, 49, 50, 51, 52, 53, 54, 55,
1012  56, 57, 58, 59, 60, 61, 62, 63
1013 };
1014 
1016  0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1017 };
1018 
1019 
1020 /**
1021  * Run-value (RLE) tables.
1022  */
1024 { /* MapTab0 */
1025  5, /* eob_sym */
1026  2, /* esc_sym */
1027  /* run table */
1028  {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1029  1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1030  1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1031  8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1032  9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1033  2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1034  8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1035  2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1036  1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1037  6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1038  22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1039  4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1040  1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1041  1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1042  6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1043  30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1044 
1045  /* value table */
1046  { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1047  6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1048  10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1049  1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1050  -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1051  7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1052  2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1053  9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1054  28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1055  3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1056  -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1057  5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1058  -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1059  37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1060  5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1061  -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1062 },{
1063  /* MapTab1 */
1064  0, /* eob_sym */
1065  38, /* esc_sym */
1066  /* run table */
1067  {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1068  7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1069  14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1070  25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1071  33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1072  37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1073  40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1074  57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1075  52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1076  60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1077  12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1078  1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1079  21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1080  29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1081  28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1082  2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1083 
1084  /* value table */
1085  {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1086  -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1087  -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1088  1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1089  1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1090  1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1091  -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1092  -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1093  1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1094  1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1095  2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1096  6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1097  2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1098  2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1099  -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1100  -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1101 },{
1102  /* MapTab2 */
1103  2, /* eob_sym */
1104  11, /* esc_sym */
1105  /* run table */
1106  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1107  2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1108  2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1109  3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1110  1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1111  9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1112  23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1113  28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1114  49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1115  3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1116  1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1117  50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1118  45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1119  17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1120  7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1121  8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1122 
1123  /* value table */
1124  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1125  2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1126  -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1127  3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1128  7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1129  2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1130  1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1131  1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1132  1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1133  -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1134  -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1135  -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1136  1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1137  -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1138  -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1139  -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1140 },{
1141  /* MapTab3 */
1142  0, /* eob_sym */
1143  35, /* esc_sym */
1144  /* run table */
1145  {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1146  7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1147  3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1148  5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1149  21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1150  9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1151  2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1152  35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1153  12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1154  43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1155  57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1156  8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1157  59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1158  60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1159  25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1160  20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1161 
1162  /* value table */
1163  { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1164  -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1165  -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1166  2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1167  1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1168  2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1169  4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1170  -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1171  2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1172  1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1173  -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1174  -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1175  -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1176  1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1177  -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1178  -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1179 },{
1180  /* MapTab4 */
1181  0, /* eob_sym */
1182  34, /* esc_sym */
1183  /* run table */
1184  {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1185  2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1186  2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1187  9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1188  1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1189  2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1190  2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1191  3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1192  4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1193  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1194  1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1195  5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1196  1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1197  3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1198  1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1199  1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1200 
1201  /* value table */
1202  { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1203  2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1204  3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1205  1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1206  18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1207  -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1208  6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1209  4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1210  3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1211  -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1212  -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1213  -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1214  -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1215  6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1216  75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1217  83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1218 },{
1219  /* MapTab5 */
1220  2, /* eob_sym */
1221  33, /* esc_sym */
1222  /* run table */
1223  {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1224  1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1225  1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1226  12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1227  6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1228  8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1229  1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1230  4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1231  1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1232  2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1233  1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1234  3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1235  1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1236  36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1237  1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1238  40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1239 
1240  /* value table */
1241  { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1242  -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1243  -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1244  1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1245  2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1246  2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1247  15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1248  -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1249  -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1250  -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1251  22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1252  7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1253  26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1254  -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1255  30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1256  -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1257 },{
1258  /* MapTab6 */
1259  2, /* eob_sym */
1260  13, /* esc_sym */
1261  /* run table */
1262  {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1263  4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1264  3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1265  4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1266  1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1267  6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1268  15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1269  2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1270  17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1271  6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1272  4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1273  1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1274  1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1275  12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1276  4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1277  14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1278 
1279  /* value table */
1280  {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1281  1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1282  2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1283  2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1284  -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1285  2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1286  -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1287  -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1288  1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1289  -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1290  -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1291  -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1292  45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1293  -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1294  6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1295  2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1296 },{
1297  /* MapTab7 */
1298  2, /* eob_sym */
1299  38, /* esc_sym */
1300  /* run table */
1301  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1302  6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1303  1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1304  14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1305  8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1306  19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1307  24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1308  26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1309  28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1310  32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1311  6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1312  37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1313  3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1314  1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1315  8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1316  12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1317 
1318  /* value table */
1319  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1320  -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1321  -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1322  1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1323  2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1324  -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1325  -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1326  1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1327  -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1328  -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1329  -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1330  -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1331  -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1332  20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1333  5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1334  3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1335 },{
1336  /* MapTab8 */
1337  4, /* eob_sym */
1338  11, /* esc_sym */
1339  /* run table */
1340  {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1341  4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1342  7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1343  2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1344  4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1345  2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1346  1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1347  25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1348  1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1349  4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1350  6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1351  37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1352  13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1353  3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1354  44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1355  50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1356 
1357  /* value table */
1358  { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1359  1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1360  1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1361  5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1362  -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1363  7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1364  15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1365  1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1366  -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1367  -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1368  4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1369  1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1370  -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1371  8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1372  1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1373  1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1374 }
1375 };
int is_empty
= 1 if this band doesn&#39;t contain any data
Definition: ivi_common.h:142
uint8_t type
macroblock type: 0 - INTRA, 1 - INTER
Definition: ivi_common.h:102
int num_MBs
number of macroblocks in this tile
Definition: ivi_common.h:121
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
Close Indeo5 decoder and clean up its context.
Definition: ivi_common.c:931
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
macroblock/block huffman table descriptor
Definition: ivi_common.h:51
int(* is_nonnull_frame)(struct IVI45DecContext *ctx)
Definition: ivi_common.h:248
InvTransformPtr * inv_transform
Definition: ivi_common.h:162
int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, IVIHuffTab *huff_tab, AVCodecContext *avctx)
Decode a huffman codebook descriptor from the bitstream and select specified huffman table...
Definition: ivi_common.c:147
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
static void skip_bits_long(GetBitContext *s, int n)
Definition: get_bits.h:198
const uint8_t ff_ivi_direct_scan_4x4[16]
Definition: ivi_common.c:1015
int num_tiles
number of tiles in this band
Definition: ivi_common.h:160
int dst_buf
buffer index for the currently decoded frame
Definition: ivi_common.h:219
int16_t * ref_buf
pointer to the reference frame buffer (for motion compensation)
Definition: ivi_common.h:139
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
uint8_t eob_sym
end of block symbol
Definition: ivi_common.h:86
int16_t * buf
pointer to the output buffer for this band
Definition: ivi_common.h:138
DSP functions (inverse transforms, motion compensations, wavelet recompostion) for Indeo Video Intera...
static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
Definition: ivi_common.c:712
IVITile * tiles
array of tile descriptors
Definition: ivi_common.h:161
int is_halfpel
precision of the motion compensation: 0 - fullpel, 1 - halfpel
Definition: ivi_common.h:145
uint8_t chroma_bands
Definition: ivi_common.h:195
void ff_ivi_mc_4x4_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type)
4x4 block motion compensation with adding delta
int(* decode_pic_hdr)(struct IVI45DecContext *ctx, AVCodecContext *avctx)
Definition: ivi_common.h:244
#define VLC_TYPE
Definition: get_bits.h:61
int plane
plane number this band belongs to
Definition: ivi_common.h:131
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
int mb_size
Definition: ivi_common.h:118
int bufsize
band buffer size in bytes
Definition: ivi_common.h:168
uint8_t run
Definition: svq3.c:136
#define blk(i)
Definition: sha.c:169
static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
Definition: ivi_common.c:128
uint16_t height
Definition: ivi_common.h:181
static uint16_t inv_bits(uint16_t val, int nbits)
Reverse "nbits" bits of the value "val" and return the result in the least significant bits...
Definition: ivi_common.c:48
void(* switch_buffers)(struct IVI45DecContext *ctx)
Definition: ivi_common.h:247
Macro definitions for various function/variable attributes.
#define FFALIGN(x, a)
Definition: common.h:63
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
RVMapDesc * rv_map
ptr to the RLE table for this band
Definition: ivi_common.h:159
uint8_t xbits[16]
Definition: ivi_common.h:45
av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
Initialize planes (prepares descriptors, allocates buffers etc).
Definition: ivi_common.c:222
static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi_common.c:394
uint8_t luma_bands
Definition: ivi_common.h:194
VLC * tab
index of one of the predefined tables or "7" for custom one
Definition: ivi_common.h:54
uint8_t bits
Definition: crc.c:216
uint8_t
#define av_cold
Definition: attributes.h:78
#define mb
const uint8_t * frame_data
input frame data pointer
Definition: ivi_common.h:208
const uint16_t * inter_base
quantization matrix for inter blocks
Definition: ivi_common.h:170
const uint8_t * data_ptr
ptr to the first byte of the band data
Definition: ivi_common.h:136
uint16_t pic_height
Definition: ivi_common.h:189
#define b
Definition: input.c:42
int inherit_mv
tells if motion vector is inherited from reference macroblock
Definition: ivi_common.h:146
void ff_ivi_mc_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type)
motion compensation without adding delta
GetBitContext gb
Definition: ivi_common.h:199
static int decode_band(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Decode an Indeo 4 or 5 band.
Definition: ivi_common.c:737
int16_t * bufs[3]
array of pointers to the band buffers
Definition: ivi_common.h:140
uint8_t * data
int pitch
pitch associated with the buffers above
Definition: ivi_common.h:141
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
uint8_t cbp
coded block pattern
Definition: ivi_common.h:103
int qdelta_present
tells if Qdelta signal is present in the bitstream (Indeo5 only)
Definition: ivi_common.h:148
bitstream reader API header.
static VLC_TYPE table_data[117592][2]
Definition: rv34.c:98
uint16_t pic_width
Definition: ivi_common.h:188
int(* decode_band_hdr)(struct IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Definition: ivi_common.h:245
IVIPlaneDesc planes[3]
color planes
Definition: ivi_common.h:216
const uint16_t * intra_base
quantization matrix for intra blocks
Definition: ivi_common.h:169
frame
Definition: stft.m:14
const IVIHuffDesc ff_ivi_mb_huff_desc[8]
static macroblock huffman tables
Definition: ivi_common.c:967
Discrete Time axis x
IVIHuffDesc cust_desc
pointer to the table associated with tab_sel
Definition: ivi_common.h:57
#define U(x)
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:557
int blk_size
block size
Definition: ivi_common.h:144
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi_common.c:1023
uint8_t runtab[256]
Definition: ivi_common.h:88
uint8_t corr[61 *2]
rvmap correction pairs
Definition: ivi_common.h:157
int32_t tab_sel
Definition: ivi_common.h:52
static int ivi_dec_tile_data_size(GetBitContext *gb)
Definition: ivi_common.c:366
RVMapDesc rvmap_tabs[9]
local corrected copy of the static rvmap tables
Definition: ivi_common.h:200
#define IVI_VLC_BITS
max number of bits of the ivi&#39;s huffman codes
Definition: ivi_common.h:36
Spectrum Plot time data
This file contains structures and macros shared by both Indeo4 and Indeo5 decoders.
int ref_buf
inter frame reference buffer index
Definition: ivi_common.h:220
DCTransformPtr * dc_transform
Definition: ivi_common.h:163
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define IVI_NUM_TILES(stride, tile_size)
calculate number of tiles in a stride
Definition: ivi_common.h:264
int32_t num_rows
Definition: ivi_common.h:44
int buf_invalid[3]
Definition: ivi_common.h:251
void ff_ivi_mc_8x8_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type)
8x8 block motion compensation with adding delta
external API header
uint8_t esc_sym
escape symbol
Definition: ivi_common.h:87
uint16_t width
Definition: ivi_common.h:180
Definition: get_bits.h:63
#define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size)
calculate number of macroblocks in a tile
Definition: ivi_common.h:267
run-value (RLE) table descriptor
Definition: ivi_common.h:85
int inherit_qdelta
tells if quantiser delta is inherited from reference macroblock
Definition: ivi_common.h:147
static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
Definition: ivi_common.c:69
uint8_t num_bands
number of bands this plane subdivided into
Definition: ivi_common.h:182
int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: ivi_common.c:844
#define FFMIN(a, b)
Definition: common.h:58
#define FFSIGN(a)
Definition: common.h:54
static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, IVITile *tile, int32_t mv_scale)
Handle empty tiles by performing data copying and motion compensation respectively.
Definition: ivi_common.c:567
t
Definition: genspecsines3.m:6
IVIMbInfo * mbs
array of macroblock descriptors
Definition: ivi_common.h:122
int32_t
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:255
const uint8_t * inter_scale
quantization coefficient for inter blocks
Definition: ivi_common.h:172
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
static VLC ivi_mb_vlc_tabs[8]
static macroblock Huffman tables
Definition: ivi_common.c:41
void ff_ivi_init_static_vlc(void)
Initialize static codes used for macroblock and block decoding.
Definition: ivi_common.c:103
#define INIT_VLC_USE_NEW_STATIC
Definition: get_bits.h:443
int8_t q_delta
quant delta
Definition: ivi_common.h:104
uint32_t frame_size
frame size in bytes
Definition: ivi_common.h:210
int table_allocated
Definition: get_bits.h:66
NULL
Definition: eval.c:55
int ypos
Definition: ivi_common.h:115
IVIHuffTab mb_vlc
current macroblock table descriptor
Definition: ivi_common.h:223
int is_2d_trans
1 indicates that the two-dimensional inverse transform is used
Definition: ivi_common.h:164
void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst, const int dst_pitch)
Haar wavelet recomposition filter for Indeo 4.
Definition: ivi_dsp.c:190
AVS_Value src
Definition: avisynth_c.h:523
int glob_quant
quant base for this band
Definition: ivi_common.h:150
typedef void(RENAME(mix_any_func_type))
enum AVCodecID codec_id
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
int height
Definition: ivi_common.h:117
static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
Definition: ivi_common.c:201
FIXME Range Coding of cb
Definition: snow.txt:367
main external API structure.
int aheight
aligned band height
Definition: ivi_common.h:135
int is_empty
= 1 if this tile doesn&#39;t contain any data
Definition: ivi_common.h:119
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int8_t valtab[256]
Definition: ivi_common.h:89
int num_corr
number of correction entries
Definition: ivi_common.h:156
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: get_bits.h:426
information for Indeo tile
Definition: ivi_common.h:113
void * buf
Definition: avisynth_c.h:594
const uint8_t ff_ivi_vertical_scan_8x8[64]
Scan patterns shared between indeo4 and indeo5.
Definition: ivi_common.c:993
av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
Initialize tile and macroblock descriptors.
Definition: ivi_common.c:286
#define INIT_VLC_LE
Definition: get_bits.h:442
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
uint8_t gop_flags
Definition: ivi_common.h:233
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
IVIBandDesc * bands
array of band descriptors
Definition: ivi_common.h:183
int32_t checksum
for debug purposes
Definition: ivi_common.h:166
int rvmap_sel
rvmap table selector
Definition: ivi_common.h:158
static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
Definition: ivi_common.c:141
int8_t mv_x
motion vector (x component)
Definition: ivi_common.h:105
int8_t mv_y
motion vector (y component)
Definition: ivi_common.h:106
int mb_size
macroblock size
Definition: ivi_common.h:143
huffman codebook descriptor
Definition: ivi_common.h:43
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:306
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
IVIMbInfo * ref_mbs
ptr to the macroblock descriptors of the reference tile
Definition: ivi_common.h:123
int xpos
Definition: ivi_common.h:114
const uint8_t * quant
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
int16_t xpos
Definition: ivi_common.h:99
int band_num
band number
Definition: ivi_common.h:132
void ff_ivi_mc_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type)
4x4 block motion compensation without adding delta
common internal api header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
int transform_size
block size of the transform
Definition: ivi_common.h:165
VLC cust_tab
custom Huffman codebook descriptor
Definition: ivi_common.h:58
function y
Definition: D.m:1
const uint8_t * scan
ptr to the scan pattern
Definition: ivi_common.h:151
int width
Definition: ivi_common.h:116
int len
int checksum_present
Definition: ivi_common.h:167
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
static int ivi_scale_mv(int mv, int mv_scale)
scale motion vector
Definition: ivi_common.h:274
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:418
const IVIHuffDesc ff_ivi_blk_huff_desc[8]
static block huffman tables
Definition: ivi_common.c:978
int(* decode_mb_info)(struct IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi_common.h:246
int16_t ypos
Definition: ivi_common.h:100
#define av_uninit(x)
Definition: attributes.h:137
information for Indeo macroblock (16x16, 8x8 or 4x4)
Definition: ivi_common.h:98
IVIHuffTab blk_vlc
vlc table for decoding block data
Definition: ivi_common.h:154
const uint8_t ff_ivi_horizontal_scan_8x8[64]
Definition: ivi_common.c:1004
const uint8_t * intra_scale
quantization coefficient for intra blocks
Definition: ivi_common.h:171
const uint8_t ff_reverse[256]
Definition: mathtables.c:72
color plane (luma or chroma) information
Definition: ivi_common.h:179
#define FFSWAP(type, a, b)
Definition: common.h:61
static VLC ivi_blk_vlc_tabs[8]
static block Huffman tables
Definition: ivi_common.c:42
uint32_t buf_offs
address in the output buffer for this mb
Definition: ivi_common.h:101
BYTE int dst_pitch
Definition: avisynth_c.h:713
#define IVI_TOSIGNED(val)
convert unsigned values into signed ones (the sign is in the LSB)
Definition: ivi_common.h:271
void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst, const int dst_pitch)
5/3 wavelet recomposition filter for Indeo5
Definition: ivi_dsp.c:33
information for Indeo wavelet band
Definition: ivi_common.h:130
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:344
#define IVI5_IS_PROTECTED
Definition: ivi_common.h:38
int data_size
size of the data in bytes
Definition: ivi_common.h:120