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  av_assert0(!band->bufs[0] && !band->bufs[1] &&
358  !band->bufs[2] && !band->bufs[3]);
359  band->bufsize = buf_size/2;
360  av_assert0(buf_size % 2 == 0);
361 
362  /* reset custom vlc */
363  planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
364  }
365  }
366 
367  return 0;
368 }
369 
370 static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile,
371  int p, int b, int t_height, int t_width)
372 {
373  int x, y;
374  IVITile *tile = band->tiles;
375 
376  for (y = 0; y < band->height; y += t_height) {
377  for (x = 0; x < band->width; x += t_width) {
378  tile->xpos = x;
379  tile->ypos = y;
380  tile->mb_size = band->mb_size;
381  tile->width = FFMIN(band->width - x, t_width);
382  tile->height = FFMIN(band->height - y, t_height);
383  tile->is_empty = tile->data_size = 0;
384  /* calculate number of macroblocks */
385  tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
386  band->mb_size);
387 
388  av_freep(&tile->mbs);
389  tile->mbs = av_mallocz_array(tile->num_MBs, sizeof(IVIMbInfo));
390  if (!tile->mbs)
391  return AVERROR(ENOMEM);
392 
393  tile->ref_mbs = 0;
394  if (p || b) {
395  if (tile->num_MBs != ref_tile->num_MBs) {
396  av_log(NULL, AV_LOG_DEBUG, "ref_tile mismatch\n");
397  return AVERROR_INVALIDDATA;
398  }
399  tile->ref_mbs = ref_tile->mbs;
400  ref_tile++;
401  }
402  tile++;
403  }
404  }
405 
406  return 0;
407 }
408 
410  int tile_width, int tile_height)
411 {
412  int p, b, x_tiles, y_tiles, t_width, t_height, ret;
413  IVIBandDesc *band;
414 
415  for (p = 0; p < 3; p++) {
416  t_width = !p ? tile_width : (tile_width + 3) >> 2;
417  t_height = !p ? tile_height : (tile_height + 3) >> 2;
418 
419  if (!p && planes[0].num_bands == 4) {
420  if (t_width % 2 || t_height % 2) {
421  avpriv_request_sample(NULL, "Odd tiles");
422  return AVERROR_PATCHWELCOME;
423  }
424  t_width >>= 1;
425  t_height >>= 1;
426  }
427  if(t_width<=0 || t_height<=0)
428  return AVERROR(EINVAL);
429 
430  for (b = 0; b < planes[p].num_bands; b++) {
431  band = &planes[p].bands[b];
432 
433  if (band->tiles) {
434  int t;
435  for (t = 0; t < band->num_tiles; t++) {
436  av_freep(&band->tiles[t].mbs);
437  }
438  }
439 
440  x_tiles = IVI_NUM_TILES(band->width, t_width);
441  y_tiles = IVI_NUM_TILES(band->height, t_height);
442  band->num_tiles = x_tiles * y_tiles;
443 
444  av_freep(&band->tiles);
445  band->tiles = av_mallocz_array(band->num_tiles, sizeof(IVITile));
446  if (!band->tiles)
447  return AVERROR(ENOMEM);
448 
449  /* use the first luma band as reference for motion vectors
450  * and quant */
451  ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
452  p, b, t_height, t_width);
453  if (ret < 0)
454  return ret;
455  }
456  }
457 
458  return 0;
459 }
460 
461 /*
462  * Decode size of the tile data.
463  * The size is stored as a variable-length field having the following format:
464  * if (tile_data_size < 255) than this field is only one byte long
465  * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
466  * where X1-X3 is size of the tile data
467  *
468  * @param[in,out] gb the GetBit context
469  * @return size of the tile data in bytes
470  */
472 {
473  int len;
474 
475  len = 0;
476  if (get_bits1(gb)) {
477  len = get_bits(gb, 8);
478  if (len == 255)
479  len = get_bits_long(gb, 24);
480  }
481 
482  /* align the bitstream reader on the byte boundary */
483  align_get_bits(gb);
484 
485  return len;
486 }
487 
488 static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs,
489  int blk_size)
490 {
491  band->dc_transform(prev_dc, band->buf + buf_offs,
492  band->pitch, blk_size);
493 
494  return 0;
495 }
496 
499  int mv_x, int mv_y,
500  int mv_x2, int mv_y2,
501  int *prev_dc, int is_intra,
502  int mc_type, int mc_type2,
503  uint32_t quant, int offs,
504  AVCodecContext *avctx)
505 {
506  const uint16_t *base_tab = is_intra ? band->intra_base : band->inter_base;
507  RVMapDesc *rvmap = band->rv_map;
508  uint8_t col_flags[8];
509  int32_t trvec[64];
510  uint32_t sym = 0, lo, hi, q;
511  int pos, run, val;
512  int blk_size = band->blk_size;
513  int num_coeffs = blk_size * blk_size;
514  int col_mask = blk_size - 1;
515  int scan_pos = -1;
516  int min_size = band->pitch * (band->transform_size - 1) +
517  band->transform_size;
518  int buf_size = band->pitch * band->aheight - offs;
519 
520  if (min_size > buf_size)
521  return AVERROR_INVALIDDATA;
522 
523  if (!band->scan) {
524  av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
525  return AVERROR_INVALIDDATA;
526  }
527 
528  /* zero transform vector */
529  memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
530  /* zero column flags */
531  memset(col_flags, 0, sizeof(col_flags));
532  while (scan_pos <= num_coeffs) {
533  sym = get_vlc2(gb, band->blk_vlc.tab->table,
534  IVI_VLC_BITS, 1);
535  if (sym == rvmap->eob_sym)
536  break; /* End of block */
537 
538  /* Escape - run/val explicitly coded using 3 vlc codes */
539  if (sym == rvmap->esc_sym) {
540  run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
541  lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
542  hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
543  /* merge them and convert into signed val */
544  val = IVI_TOSIGNED((hi << 6) | lo);
545  } else {
546  if (sym >= 256U) {
547  av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
548  return AVERROR_INVALIDDATA;
549  }
550  run = rvmap->runtab[sym];
551  val = rvmap->valtab[sym];
552  }
553 
554  /* de-zigzag and dequantize */
555  scan_pos += run;
556  if (scan_pos >= num_coeffs || scan_pos < 0)
557  break;
558  pos = band->scan[scan_pos];
559 
560  if (!val)
561  ff_dlog(avctx, "Val = 0 encountered!\n");
562 
563  q = (base_tab[pos] * quant) >> 9;
564  if (q > 1)
565  val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
566  trvec[pos] = val;
567  /* track columns containing non-zero coeffs */
568  col_flags[pos & col_mask] |= !!val;
569  }
570 
571  if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
572  return AVERROR_INVALIDDATA; /* corrupt block data */
573 
574  /* undoing DC coeff prediction for intra-blocks */
575  if (is_intra && band->is_2d_trans) {
576  *prev_dc += trvec[0];
577  trvec[0] = *prev_dc;
578  col_flags[0] |= !!*prev_dc;
579  }
580 
581  if(band->transform_size > band->blk_size){
582  av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
583  return AVERROR_INVALIDDATA;
584  }
585 
586  /* apply inverse transform */
587  band->inv_transform(trvec, band->buf + offs,
588  band->pitch, col_flags);
589 
590  /* apply motion compensation */
591  if (!is_intra)
592  return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
593  mc_type, mc_type2);
594 
595  return 0;
596 }
597 /*
598  * Decode block data:
599  * extract huffman-coded transform coefficients from the bitstream,
600  * dequantize them, apply inverse transform and motion compensation
601  * in order to reconstruct the picture.
602  *
603  * @param[in,out] gb the GetBit context
604  * @param[in] band pointer to the band descriptor
605  * @param[in] tile pointer to the tile descriptor
606  * @return result code: 0 - OK, -1 = error (corrupted blocks data)
607  */
608 static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band,
609  IVITile *tile, AVCodecContext *avctx)
610 {
611  int mbn, blk, num_blocks, blk_size, ret, is_intra;
612  int mc_type = 0, mc_type2 = -1;
613  int mv_x = 0, mv_y = 0, mv_x2 = 0, mv_y2 = 0;
614  int32_t prev_dc;
615  uint32_t cbp, quant, buf_offs;
616  IVIMbInfo *mb;
617  ivi_mc_func mc_with_delta_func, mc_no_delta_func;
618  ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
619  const uint8_t *scale_tab;
620 
621  /* init intra prediction for the DC coefficient */
622  prev_dc = 0;
623  blk_size = band->blk_size;
624  /* number of blocks per mb */
625  num_blocks = (band->mb_size != blk_size) ? 4 : 1;
626  if (blk_size == 8) {
627  mc_with_delta_func = ff_ivi_mc_8x8_delta;
628  mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
629  mc_avg_with_delta_func = ff_ivi_mc_avg_8x8_delta;
630  mc_avg_no_delta_func = ff_ivi_mc_avg_8x8_no_delta;
631  } else {
632  mc_with_delta_func = ff_ivi_mc_4x4_delta;
633  mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
634  mc_avg_with_delta_func = ff_ivi_mc_avg_4x4_delta;
635  mc_avg_no_delta_func = ff_ivi_mc_avg_4x4_no_delta;
636  }
637 
638  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
639  is_intra = !mb->type;
640  cbp = mb->cbp;
641  buf_offs = mb->buf_offs;
642 
643  quant = band->glob_quant + mb->q_delta;
644  if (avctx->codec_id == AV_CODEC_ID_INDEO4)
645  quant = av_clip_uintp2(quant, 5);
646  else
647  quant = av_clip(quant, 0, 23);
648 
649  scale_tab = is_intra ? band->intra_scale : band->inter_scale;
650  if (scale_tab)
651  quant = scale_tab[quant];
652 
653  if (!is_intra) {
654  mv_x = mb->mv_x;
655  mv_y = mb->mv_y;
656  mv_x2 = mb->b_mv_x;
657  mv_y2 = mb->b_mv_y;
658  if (band->is_halfpel) {
659  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
660  mc_type2 = ((mv_y2 & 1) << 1) | (mv_x2 & 1);
661  mv_x >>= 1;
662  mv_y >>= 1;
663  mv_x2 >>= 1;
664  mv_y2 >>= 1; /* convert halfpel vectors into fullpel ones */
665  }
666  if (mb->type == 2)
667  mc_type = -1;
668  if (mb->type != 2 && mb->type != 3)
669  mc_type2 = -1;
670  if (mb->type) {
671  int dmv_x, dmv_y, cx, cy;
672 
673  dmv_x = mb->mv_x >> band->is_halfpel;
674  dmv_y = mb->mv_y >> band->is_halfpel;
675  cx = mb->mv_x & band->is_halfpel;
676  cy = mb->mv_y & band->is_halfpel;
677 
678  if (mb->xpos + dmv_x < 0 ||
679  mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
680  mb->ypos + dmv_y < 0 ||
681  mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
682  return AVERROR_INVALIDDATA;
683  }
684  }
685  if (mb->type == 2 || mb->type == 3) {
686  int dmv_x, dmv_y, cx, cy;
687 
688  dmv_x = mb->b_mv_x >> band->is_halfpel;
689  dmv_y = mb->b_mv_y >> band->is_halfpel;
690  cx = mb->b_mv_x & band->is_halfpel;
691  cy = mb->b_mv_y & band->is_halfpel;
692 
693  if (mb->xpos + dmv_x < 0 ||
694  mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
695  mb->ypos + dmv_y < 0 ||
696  mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
697  return AVERROR_INVALIDDATA;
698  }
699  }
700  }
701 
702  for (blk = 0; blk < num_blocks; blk++) {
703  /* adjust block position in the buffer according to its number */
704  if (blk & 1) {
705  buf_offs += blk_size;
706  } else if (blk == 2) {
707  buf_offs -= blk_size;
708  buf_offs += blk_size * band->pitch;
709  }
710 
711  if (cbp & 1) { /* block coded ? */
712  ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
713  mc_avg_with_delta_func,
714  mv_x, mv_y, mv_x2, mv_y2,
715  &prev_dc, is_intra,
716  mc_type, mc_type2, quant,
717  buf_offs, avctx);
718  if (ret < 0)
719  return ret;
720  } else {
721  int buf_size = band->pitch * band->aheight - buf_offs;
722  int min_size = (blk_size - 1) * band->pitch + blk_size;
723 
724  if (min_size > buf_size)
725  return AVERROR_INVALIDDATA;
726  /* block not coded */
727  /* for intra blocks apply the dc slant transform */
728  /* for inter - perform the motion compensation without delta */
729  if (is_intra) {
730  ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
731  if (ret < 0)
732  return ret;
733  } else {
734  ret = ivi_mc(band, mc_no_delta_func, mc_avg_no_delta_func,
735  buf_offs, mv_x, mv_y, mv_x2, mv_y2,
736  mc_type, mc_type2);
737  if (ret < 0)
738  return ret;
739  }
740  }
741 
742  cbp >>= 1;
743  }// for blk
744  }// for mbn
745 
746  align_get_bits(gb);
747 
748  return 0;
749 }
750 
751 /**
752  * Handle empty tiles by performing data copying and motion
753  * compensation respectively.
754  *
755  * @param[in] avctx ptr to the AVCodecContext
756  * @param[in] band pointer to the band descriptor
757  * @param[in] tile pointer to the tile descriptor
758  * @param[in] mv_scale scaling factor for motion vectors
759  */
760 static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band,
761  IVITile *tile, int32_t mv_scale)
762 {
763  int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
764  int offs, mb_offset, row_offset, ret;
765  IVIMbInfo *mb, *ref_mb;
766  const int16_t *src;
767  int16_t *dst;
768  ivi_mc_func mc_no_delta_func;
769  int clear_first = !band->qdelta_present && !band->plane && !band->band_num;
770  int mb_size = band->mb_size;
771  int xend = tile->xpos + tile->width;
772  int is_halfpel = band->is_halfpel;
773  int pitch = band->pitch;
774 
775  if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, mb_size)) {
776  av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
777  "parameters %d in ivi_process_empty_tile()\n",
778  tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, mb_size));
779  return AVERROR_INVALIDDATA;
780  }
781 
782  offs = tile->ypos * pitch + tile->xpos;
783  mb = tile->mbs;
784  ref_mb = tile->ref_mbs;
785  row_offset = mb_size * pitch;
786  need_mc = 0; /* reset the mc tracking flag */
787 
788  for (y = tile->ypos; y < (tile->ypos + tile->height); y += mb_size) {
789  mb_offset = offs;
790 
791  for (x = tile->xpos; x < xend; x += mb_size) {
792  mb->xpos = x;
793  mb->ypos = y;
794  mb->buf_offs = mb_offset;
795 
796  mb->type = 1; /* set the macroblocks type = INTER */
797  mb->cbp = 0; /* all blocks are empty */
798 
799  if (clear_first) {
800  mb->q_delta = band->glob_quant;
801  mb->mv_x = 0;
802  mb->mv_y = 0;
803  }
804 
805  if (ref_mb) {
806  if (band->inherit_qdelta)
807  mb->q_delta = ref_mb->q_delta;
808 
809  if (band->inherit_mv) {
810  /* motion vector inheritance */
811  if (mv_scale) {
812  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
813  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
814  } else {
815  mb->mv_x = ref_mb->mv_x;
816  mb->mv_y = ref_mb->mv_y;
817  }
818  need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
819  {
820  int dmv_x, dmv_y, cx, cy;
821 
822  dmv_x = mb->mv_x >> is_halfpel;
823  dmv_y = mb->mv_y >> is_halfpel;
824  cx = mb->mv_x & is_halfpel;
825  cy = mb->mv_y & is_halfpel;
826 
827  if ( mb->xpos + dmv_x < 0
828  || mb->xpos + dmv_x + mb_size + cx > pitch
829  || mb->ypos + dmv_y < 0
830  || mb->ypos + dmv_y + mb_size + cy > band->aheight) {
831  av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
832  return AVERROR_INVALIDDATA;
833  }
834  }
835  }
836  ref_mb++;
837  }
838 
839  mb++;
840  mb_offset += mb_size;
841  } // for x
842  offs += row_offset;
843  } // for y
844 
845  if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
846  num_blocks = (mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
847  mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
849 
850  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
851  mv_x = mb->mv_x;
852  mv_y = mb->mv_y;
853  if (!band->is_halfpel) {
854  mc_type = 0; /* we have only fullpel vectors */
855  } else {
856  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
857  mv_x >>= 1;
858  mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
859  }
860 
861  for (blk = 0; blk < num_blocks; blk++) {
862  /* adjust block position in the buffer according with its number */
863  offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * pitch);
864  ret = ivi_mc(band, mc_no_delta_func, 0, offs,
865  mv_x, mv_y, 0, 0, mc_type, -1);
866  if (ret < 0)
867  return ret;
868  }
869  }
870  } else {
871  /* copy data from the reference tile into the current one */
872  src = band->ref_buf + tile->ypos * pitch + tile->xpos;
873  dst = band->buf + tile->ypos * pitch + tile->xpos;
874  for (y = 0; y < tile->height; y++) {
875  memcpy(dst, src, tile->width*sizeof(band->buf[0]));
876  src += pitch;
877  dst += pitch;
878  }
879  }
880 
881  return 0;
882 }
883 
884 
885 #ifdef DEBUG
886 static uint16_t ivi_calc_band_checksum(const IVIBandDesc *band)
887 {
888  int x, y;
889  int16_t *src, checksum;
890 
891  src = band->buf;
892  checksum = 0;
893 
894  for (y = 0; y < band->height; src += band->pitch, y++)
895  for (x = 0; x < band->width; x++)
896  checksum += src[x];
897 
898  return checksum;
899 }
900 #endif
901 
902 /*
903  * Convert and output the current plane.
904  * This conversion is done by adding back the bias value of 128
905  * (subtracted in the encoder) and clipping the result.
906  *
907  * @param[in] plane pointer to the descriptor of the plane being processed
908  * @param[out] dst pointer to the buffer receiving converted pixels
909  * @param[in] dst_pitch pitch for moving to the next y line
910  */
911 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
912 {
913  int x, y;
914  const int16_t *src = plane->bands[0].buf;
915  ptrdiff_t pitch = plane->bands[0].pitch;
916 
917  if (!src)
918  return;
919 
920  for (y = 0; y < plane->height; y++) {
921  int m = 0;
922  int w = plane->width;
923  for (x = 0; x < w; x++) {
924  int t = src[x] + 128;
925  dst[x] = t;
926  m |= t;
927  }
928  if (m & ~255)
929  for (x = 0; x < w; x++)
930  dst[x] = av_clip_uint8(src[x] + 128);
931  src += pitch;
932  dst += dst_pitch;
933  }
934 }
935 
936 static void *prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
937 {
938  if (ctx->pic_conf.luma_bands <= 1 && i == 2)
939  return NULL;
940  if (!band->bufs[i])
941  band->bufs[i] = av_mallocz(2 * band->bufsize);
942  return band->bufs[i];
943 }
944 
945 /**
946  * Decode an Indeo 4 or 5 band.
947  *
948  * @param[in,out] ctx ptr to the decoder context
949  * @param[in,out] band ptr to the band descriptor
950  * @param[in] avctx ptr to the AVCodecContext
951  * @return result code: 0 = OK, -1 = error
952  */
954  IVIBandDesc *band, AVCodecContext *avctx)
955 {
956  int result, i, t, idx1, idx2, pos;
957  IVITile *tile;
958 
959  band->buf = prepare_buf(ctx, band, ctx->dst_buf);
960  if (!band->buf) {
961  av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
962  return AVERROR_INVALIDDATA;
963  }
964  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
965  band->ref_buf = prepare_buf(ctx, band, ctx->b_ref_buf);
966  band->b_ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
967  if (!band->b_ref_buf)
968  return AVERROR(ENOMEM);
969  } else {
970  band->ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
971  band->b_ref_buf = 0;
972  }
973  if (!band->ref_buf)
974  return AVERROR(ENOMEM);
975  band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
976 
977  result = ctx->decode_band_hdr(ctx, band, avctx);
978  if (result) {
979  av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
980  result);
981  return result;
982  }
983 
984  if (band->is_empty) {
985  av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
986  return AVERROR_INVALIDDATA;
987  }
988 
989  band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
990 
991  /* apply corrections to the selected rvmap table if present */
992  for (i = 0; i < band->num_corr; i++) {
993  idx1 = band->corr[i * 2];
994  idx2 = band->corr[i * 2 + 1];
995  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
996  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
997  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
998  band->rv_map->eob_sym ^= idx1 ^ idx2;
999  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1000  band->rv_map->esc_sym ^= idx1 ^ idx2;
1001  }
1002 
1003  pos = get_bits_count(&ctx->gb);
1004 
1005  for (t = 0; t < band->num_tiles; t++) {
1006  tile = &band->tiles[t];
1007 
1008  if (tile->mb_size != band->mb_size) {
1009  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
1010  band->mb_size, tile->mb_size);
1011  return AVERROR_INVALIDDATA;
1012  }
1013  tile->is_empty = get_bits1(&ctx->gb);
1014  if (tile->is_empty) {
1015  result = ivi_process_empty_tile(avctx, band, tile,
1016  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1017  if (result < 0)
1018  break;
1019  ff_dlog(avctx, "Empty tile encountered!\n");
1020  } else {
1021  tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1022  if (!tile->data_size) {
1023  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1024  result = AVERROR_INVALIDDATA;
1025  break;
1026  }
1027 
1028  result = ctx->decode_mb_info(ctx, band, tile, avctx);
1029  if (result < 0)
1030  break;
1031 
1032  result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1033  if (result < 0) {
1034  av_log(avctx, AV_LOG_ERROR,
1035  "Corrupted tile data encountered!\n");
1036  break;
1037  }
1038 
1039  if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1040  av_log(avctx, AV_LOG_ERROR,
1041  "Tile data_size mismatch!\n");
1042  result = AVERROR_INVALIDDATA;
1043  break;
1044  }
1045 
1046  pos += tile->data_size << 3; // skip to next tile
1047  }
1048  }
1049 
1050  /* restore the selected rvmap table by applying its corrections in
1051  * reverse order */
1052  for (i = band->num_corr-1; i >= 0; i--) {
1053  idx1 = band->corr[i*2];
1054  idx2 = band->corr[i*2+1];
1055  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1056  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1057  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1058  band->rv_map->eob_sym ^= idx1 ^ idx2;
1059  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1060  band->rv_map->esc_sym ^= idx1 ^ idx2;
1061  }
1062 
1063 #ifdef DEBUG
1064  if (band->checksum_present) {
1065  uint16_t chksum = ivi_calc_band_checksum(band);
1066  if (chksum != band->checksum) {
1067  av_log(avctx, AV_LOG_ERROR,
1068  "Band checksum mismatch! Plane %d, band %d, "
1069  "received: %"PRIx32", calculated: %"PRIx16"\n",
1070  band->plane, band->band_num, band->checksum, chksum);
1071  }
1072  }
1073 #endif
1074 
1075  align_get_bits(&ctx->gb);
1076 
1077  return result;
1078 }
1079 
1080 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1081  AVPacket *avpkt)
1082 {
1083  IVI45DecContext *ctx = avctx->priv_data;
1084  const uint8_t *buf = avpkt->data;
1085  AVFrame *frame = data;
1086  int buf_size = avpkt->size;
1087  int result, p, b;
1088 
1089  result = init_get_bits8(&ctx->gb, buf, buf_size);
1090  if (result < 0)
1091  return result;
1092  ctx->frame_data = buf;
1093  ctx->frame_size = buf_size;
1094 
1095  result = ctx->decode_pic_hdr(ctx, avctx);
1096  if (result) {
1097  av_log(avctx, AV_LOG_ERROR,
1098  "Error while decoding picture header: %d\n", result);
1099  return result;
1100  }
1101  if (ctx->gop_invalid)
1102  return AVERROR_INVALIDDATA;
1103 
1104  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1105  if (ctx->got_p_frame) {
1106  av_frame_move_ref(data, ctx->p_frame);
1107  *got_frame = 1;
1108  ctx->got_p_frame = 0;
1109  } else {
1110  *got_frame = 0;
1111  }
1112  return buf_size;
1113  }
1114 
1115  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1116  avpriv_report_missing_feature(avctx, "Password-protected clip");
1117  return AVERROR_PATCHWELCOME;
1118  }
1119 
1120  if (!ctx->planes[0].bands) {
1121  av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1122  return AVERROR_INVALIDDATA;
1123  }
1124 
1125  ctx->switch_buffers(ctx);
1126 
1127  //{ START_TIMER;
1128 
1129  if (ctx->is_nonnull_frame(ctx)) {
1130  ctx->buf_invalid[ctx->dst_buf] = 1;
1131  for (p = 0; p < 3; p++) {
1132  for (b = 0; b < ctx->planes[p].num_bands; b++) {
1133  result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1134  if (result < 0) {
1135  av_log(avctx, AV_LOG_ERROR,
1136  "Error while decoding band: %d, plane: %d\n", b, p);
1137  return result;
1138  }
1139  }
1140  }
1141  ctx->buf_invalid[ctx->dst_buf] = 0;
1142  } else {
1143  if (ctx->is_scalable)
1144  return AVERROR_INVALIDDATA;
1145 
1146  for (p = 0; p < 3; p++) {
1147  if (!ctx->planes[p].bands[0].buf)
1148  return AVERROR_INVALIDDATA;
1149  }
1150  }
1151  if (ctx->buf_invalid[ctx->dst_buf])
1152  return -1;
1153 
1154  //STOP_TIMER("decode_planes"); }
1155 
1156  if (!ctx->is_nonnull_frame(ctx))
1157  return buf_size;
1158 
1159  result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1160  if (result < 0)
1161  return result;
1162 
1163  if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1164  return result;
1165 
1166  if (ctx->is_scalable) {
1167  if (ctx->is_indeo4)
1168  ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1169  else
1170  ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1171  } else {
1172  ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1173  }
1174 
1175  ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1176  ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1177 
1178  *got_frame = 1;
1179 
1180  /* If the bidirectional mode is enabled, next I and the following P
1181  * frame will be sent together. Unfortunately the approach below seems
1182  * to be the only way to handle the B-frames mode.
1183  * That's exactly the same Intel decoders do.
1184  */
1185  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1186  int left;
1187 
1188  // skip version string
1189  while (get_bits(&ctx->gb, 8)) {
1190  if (get_bits_left(&ctx->gb) < 8)
1191  return AVERROR_INVALIDDATA;
1192  }
1193  left = get_bits_count(&ctx->gb) & 0x18;
1194  skip_bits_long(&ctx->gb, 64 - left);
1195  if (get_bits_left(&ctx->gb) > 18 &&
1196  show_bits_long(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1197  AVPacket pkt;
1198  pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1199  pkt.size = get_bits_left(&ctx->gb) >> 3;
1200  ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1201  }
1202  }
1203 
1204  if (ctx->show_indeo4_info) {
1205  if (ctx->is_scalable)
1206  av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1207  if (ctx->uses_tiling)
1208  av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1209  if (ctx->has_b_frames)
1210  av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1211  if (ctx->has_transp)
1212  av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1213  if (ctx->uses_haar)
1214  av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1215  if (ctx->uses_fullpel)
1216  av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1217  ctx->show_indeo4_info = 0;
1218  }
1219 
1220  return buf_size;
1221 }
1222 
1223 /**
1224  * Close Indeo5 decoder and clean up its context.
1225  */
1227 {
1228  IVI45DecContext *ctx = avctx->priv_data;
1229 
1230  ivi_free_buffers(&ctx->planes[0]);
1231 
1232  if (ctx->mb_vlc.cust_tab.table)
1233  ff_free_vlc(&ctx->mb_vlc.cust_tab);
1234 
1235  if (ctx->blk_vlc.cust_tab.table)
1236  ff_free_vlc(&ctx->blk_vlc.cust_tab);
1237 
1238  av_frame_free(&ctx->p_frame);
1239 
1240  return 0;
1241 }
1242 
1243 
1244 /**
1245  * Scan patterns shared between indeo4 and indeo5
1246  */
1248  0, 8, 16, 24, 32, 40, 48, 56,
1249  1, 9, 17, 25, 33, 41, 49, 57,
1250  2, 10, 18, 26, 34, 42, 50, 58,
1251  3, 11, 19, 27, 35, 43, 51, 59,
1252  4, 12, 20, 28, 36, 44, 52, 60,
1253  5, 13, 21, 29, 37, 45, 53, 61,
1254  6, 14, 22, 30, 38, 46, 54, 62,
1255  7, 15, 23, 31, 39, 47, 55, 63
1256 };
1257 
1259  0, 1, 2, 3, 4, 5, 6, 7,
1260  8, 9, 10, 11, 12, 13, 14, 15,
1261  16, 17, 18, 19, 20, 21, 22, 23,
1262  24, 25, 26, 27, 28, 29, 30, 31,
1263  32, 33, 34, 35, 36, 37, 38, 39,
1264  40, 41, 42, 43, 44, 45, 46, 47,
1265  48, 49, 50, 51, 52, 53, 54, 55,
1266  56, 57, 58, 59, 60, 61, 62, 63
1267 };
1268 
1270  0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1271 };
1272 
1273 
1274 /**
1275  * Run-value (RLE) tables.
1276  */
1278 { /* MapTab0 */
1279  5, /* eob_sym */
1280  2, /* esc_sym */
1281  /* run table */
1282  {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1283  1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1284  1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1285  8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1286  9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1287  2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1288  8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1289  2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1290  1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1291  6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1292  22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1293  4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1294  1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1295  1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1296  6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1297  30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1298 
1299  /* value table */
1300  { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1301  6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1302  10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1303  1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1304  -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1305  7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1306  2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1307  9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1308  28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1309  3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1310  -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1311  5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1312  -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1313  37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1314  5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1315  -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1316 },{
1317  /* MapTab1 */
1318  0, /* eob_sym */
1319  38, /* esc_sym */
1320  /* run table */
1321  {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1322  7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1323  14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1324  25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1325  33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1326  37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1327  40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1328  57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1329  52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1330  60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1331  12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1332  1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1333  21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1334  29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1335  28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1336  2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1337 
1338  /* value table */
1339  {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1340  -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1341  -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1342  1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1343  1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1344  1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1345  -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1346  -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1347  1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1348  1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1349  2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1350  6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1351  2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1352  2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1353  -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1354  -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1355 },{
1356  /* MapTab2 */
1357  2, /* eob_sym */
1358  11, /* esc_sym */
1359  /* run table */
1360  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1361  2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1362  2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1363  3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1364  1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1365  9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1366  23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1367  28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1368  49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1369  3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1370  1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1371  50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1372  45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1373  17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1374  7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1375  8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1376 
1377  /* value table */
1378  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1379  2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1380  -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1381  3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1382  7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1383  2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1384  1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1385  1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1386  1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1387  -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1388  -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1389  -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1390  1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1391  -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1392  -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1393  -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1394 },{
1395  /* MapTab3 */
1396  0, /* eob_sym */
1397  35, /* esc_sym */
1398  /* run table */
1399  {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1400  7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1401  3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1402  5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1403  21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1404  9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1405  2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1406  35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1407  12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1408  43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1409  57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1410  8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1411  59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1412  60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1413  25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1414  20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1415 
1416  /* value table */
1417  { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1418  -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1419  -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1420  2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1421  1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1422  2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1423  4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1424  -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1425  2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1426  1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1427  -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1428  -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1429  -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1430  1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1431  -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1432  -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1433 },{
1434  /* MapTab4 */
1435  0, /* eob_sym */
1436  34, /* esc_sym */
1437  /* run table */
1438  {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1439  2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1440  2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1441  9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1442  1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1443  2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1444  2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1445  3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1446  4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1447  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1448  1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1449  5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1450  1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1451  3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1452  1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1453  1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1454 
1455  /* value table */
1456  { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1457  2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1458  3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1459  1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1460  18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1461  -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1462  6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1463  4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1464  3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1465  -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1466  -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1467  -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1468  -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1469  6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1470  75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1471  83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1472 },{
1473  /* MapTab5 */
1474  2, /* eob_sym */
1475  33, /* esc_sym */
1476  /* run table */
1477  {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1478  1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1479  1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1480  12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1481  6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1482  8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1483  1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1484  4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1485  1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1486  2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1487  1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1488  3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1489  1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1490  36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1491  1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1492  40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1493 
1494  /* value table */
1495  { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1496  -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1497  -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1498  1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1499  2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1500  2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1501  15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1502  -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1503  -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1504  -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1505  22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1506  7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1507  26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1508  -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1509  30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1510  -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1511 },{
1512  /* MapTab6 */
1513  2, /* eob_sym */
1514  13, /* esc_sym */
1515  /* run table */
1516  {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1517  4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1518  3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1519  4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1520  1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1521  6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1522  15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1523  2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1524  17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1525  6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1526  4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1527  1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1528  1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1529  12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1530  4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1531  14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1532 
1533  /* value table */
1534  {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1535  1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1536  2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1537  2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1538  -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1539  2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1540  -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1541  -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1542  1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1543  -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1544  -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1545  -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1546  45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1547  -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1548  6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1549  2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1550 },{
1551  /* MapTab7 */
1552  2, /* eob_sym */
1553  38, /* esc_sym */
1554  /* run table */
1555  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1556  6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1557  1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1558  14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1559  8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1560  19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1561  24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1562  26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1563  28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1564  32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1565  6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1566  37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1567  3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1568  1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1569  8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1570  12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1571 
1572  /* value table */
1573  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1574  -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1575  -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1576  1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1577  2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1578  -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1579  -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1580  1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1581  -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1582  -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1583  -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1584  -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1585  -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1586  20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1587  5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1588  3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1589 },{
1590  /* MapTab8 */
1591  4, /* eob_sym */
1592  11, /* esc_sym */
1593  /* run table */
1594  {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1595  4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1596  7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1597  2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1598  4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1599  2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1600  1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1601  25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1602  1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1603  4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1604  6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1605  37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1606  13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1607  3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1608  44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1609  50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1610 
1611  /* value table */
1612  { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1613  1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1614  1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1615  5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1616  -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1617  7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1618  15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1619  1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1620  -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1621  -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1622  4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1623  1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1624  -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1625  8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1626  1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1627  1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1628 }
1629 };
#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:1269
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:497
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:1226
#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:1481
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:1080
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
IVIPicConfig pic_conf
Definition: ivi.h:229
#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:139
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:471
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
static void * prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
Definition: ivi.c:936
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:370
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:1480
const uint8_t ff_ivi_vertical_scan_8x8[64]
Scan patterns shared between indeo4 and indeo5.
Definition: ivi.c:1247
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:409
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:3295
static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi.c:608
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:953
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:488
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:1258
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi.c:1277
#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
#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:1578
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:1568
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:1968
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:760
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:911
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:1595
int width
Definition: ivi.h:130
static const struct @317 planes[]
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:1457
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