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