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