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