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