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 
34 #define BITSTREAM_READER_LE
35 #include "avcodec.h"
36 #include "get_bits.h"
37 #include "internal.h"
38 #include "mathops.h"
39 #include "ivi.h"
40 #include "ivi_dsp.h"
41 
42 /**
43  * These are 2x8 predefined Huffman codebooks for coding macroblock/block
44  * signals. They are specified using "huffman descriptors" in order to
45  * avoid huge static tables. The decoding tables will be generated at
46  * startup from these descriptors.
47  */
48 /** static macroblock huffman tables */
49 static const IVIHuffDesc ivi_mb_huff_desc[8] = {
50  {8, {0, 4, 5, 4, 4, 4, 6, 6}},
51  {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
52  {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
53  {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
54  {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
55  {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
56  {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
57  {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
58 };
59 
60 /** static block huffman tables */
61 static const IVIHuffDesc ivi_blk_huff_desc[8] = {
62  {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
63  {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
64  {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
65  {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
66  {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
67  {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
68  {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
69  {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
70 };
71 
72 static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables
73 static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables
74 
75 typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf,
76  ptrdiff_t pitch, int mc_type);
77 typedef void (*ivi_mc_avg_func) (int16_t *buf, const int16_t *ref_buf1,
78  const int16_t *ref_buf2,
79  ptrdiff_t pitch, int mc_type, int mc_type2);
80 
81 static int ivi_mc(const IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg,
82  int offs, int mv_x, int mv_y, int mv_x2, int mv_y2,
83  int mc_type, int mc_type2)
84 {
85  int ref_offs = offs + mv_y * band->pitch + mv_x;
86  int buf_size = band->pitch * band->aheight;
87  int min_size = band->pitch * (band->blk_size - 1) + band->blk_size;
88  int ref_size = (mc_type > 1) * band->pitch + (mc_type & 1);
89 
90  if (mc_type != -1) {
91  av_assert0(offs >= 0 && ref_offs >= 0 && band->ref_buf);
92  av_assert0(buf_size - min_size >= offs);
93  av_assert0(buf_size - min_size - ref_size >= ref_offs);
94  }
95 
96  if (mc_type2 == -1) {
97  mc(band->buf + offs, band->ref_buf + ref_offs, band->pitch, mc_type);
98  } else {
99  int ref_offs2 = offs + mv_y2 * band->pitch + mv_x2;
100  int ref_size2 = (mc_type2 > 1) * band->pitch + (mc_type2 & 1);
101  if (offs < 0 || ref_offs2 < 0 || !band->b_ref_buf)
102  return AVERROR_INVALIDDATA;
103  if (buf_size - min_size - ref_size2 < ref_offs2)
104  return AVERROR_INVALIDDATA;
105 
106  if (mc_type == -1)
107  mc(band->buf + offs, band->b_ref_buf + ref_offs2,
108  band->pitch, mc_type2);
109  else
110  mc_avg(band->buf + offs, band->ref_buf + ref_offs,
111  band->b_ref_buf + ref_offs2, band->pitch,
112  mc_type, mc_type2);
113  }
114 
115  return 0;
116 }
117 
118 /**
119  * Reverse "nbits" bits of the value "val" and return the result
120  * in the least significant bits.
121  */
122 static uint16_t inv_bits(uint16_t val, int nbits)
123 {
124  uint16_t res;
125 
126  if (nbits <= 8) {
127  res = ff_reverse[val] >> (8 - nbits);
128  } else
129  res = ((ff_reverse[val & 0xFF] << 8) +
130  (ff_reverse[val >> 8])) >> (16 - nbits);
131 
132  return res;
133 }
134 
135 /*
136  * Generate a huffman codebook from the given descriptor
137  * and convert it into the FFmpeg VLC table.
138  *
139  * @param[in] cb pointer to codebook descriptor
140  * @param[out] vlc where to place the generated VLC table
141  * @param[in] flag flag: 1 - for static or 0 for dynamic tables
142  * @return result code: 0 - OK, -1 = error (invalid codebook descriptor)
143  */
144 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
145 {
146  int pos, i, j, codes_per_row, prefix, not_last_row;
147  uint16_t codewords[256]; /* FIXME: move this temporal storage out? */
148  uint8_t bits[256];
149 
150  pos = 0; /* current position = 0 */
151 
152  for (i = 0; i < cb->num_rows; i++) {
153  codes_per_row = 1 << cb->xbits[i];
154  not_last_row = (i != cb->num_rows - 1);
155  prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
156 
157  for (j = 0; j < codes_per_row; j++) {
158  if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */
159  break; /* elements, but only 256 codes are allowed! */
160 
161  bits[pos] = i + cb->xbits[i] + not_last_row;
162  if (bits[pos] > IVI_VLC_BITS)
163  return AVERROR_INVALIDDATA; /* invalid descriptor */
164 
165  codewords[pos] = inv_bits((prefix | j), bits[pos]);
166  if (!bits[pos])
167  bits[pos] = 1;
168 
169  pos++;
170  }//for j
171  }//for i
172 
173  /* number of codewords = pos */
174  return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
176 }
177 
179 {
180  int i;
181  static VLC_TYPE table_data[8192 * 16][2];
182  static int initialized_vlcs = 0;
183 
184  if (initialized_vlcs)
185  return;
186  for (i = 0; i < 8; i++) {
187  ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
190  &ivi_mb_vlc_tabs[i], 1);
191  ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
194  &ivi_blk_vlc_tabs[i], 1);
195  }
196  initialized_vlcs = 1;
197 }
198 
199 /*
200  * Copy huffman codebook descriptors.
201  *
202  * @param[out] dst ptr to the destination descriptor
203  * @param[in] src ptr to the source descriptor
204  */
206 {
207  dst->num_rows = src->num_rows;
208  memcpy(dst->xbits, src->xbits, src->num_rows);
209 }
210 
211 /*
212  * Compare two huffman codebook descriptors.
213  *
214  * @param[in] desc1 ptr to the 1st descriptor to compare
215  * @param[in] desc2 ptr to the 2nd descriptor to compare
216  * @return comparison result: 0 - equal, 1 - not equal
217  */
218 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1,
219  const IVIHuffDesc *desc2)
220 {
221  return desc1->num_rows != desc2->num_rows ||
222  memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
223 }
224 
225 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
226  IVIHuffTab *huff_tab, AVCodecContext *avctx)
227 {
228  int i, result;
229  IVIHuffDesc new_huff;
230 
231  if (!desc_coded) {
232  /* select default table */
233  huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
234  : &ivi_mb_vlc_tabs [7];
235  return 0;
236  }
237 
238  huff_tab->tab_sel = get_bits(gb, 3);
239  if (huff_tab->tab_sel == 7) {
240  /* custom huffman table (explicitly encoded) */
241  new_huff.num_rows = get_bits(gb, 4);
242  if (!new_huff.num_rows) {
243  av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
244  return AVERROR_INVALIDDATA;
245  }
246 
247  for (i = 0; i < new_huff.num_rows; i++)
248  new_huff.xbits[i] = get_bits(gb, 4);
249 
250  /* Have we got the same custom table? Rebuild if not. */
251  if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
252  ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
253 
254  if (huff_tab->cust_tab.table)
255  ff_free_vlc(&huff_tab->cust_tab);
257  &huff_tab->cust_tab, 0);
258  if (result) {
259  // reset faulty description
260  huff_tab->cust_desc.num_rows = 0;
261  av_log(avctx, AV_LOG_ERROR,
262  "Error while initializing custom vlc table!\n");
263  return result;
264  }
265  }
266  huff_tab->tab = &huff_tab->cust_tab;
267  } else {
268  /* select one of predefined tables */
269  huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
270  : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
271  }
272 
273  return 0;
274 }
275 
276 /*
277  * Free planes, bands and macroblocks buffers.
278  *
279  * @param[in] planes pointer to the array of the plane descriptors
280  */
282 {
283  int p, b, t;
284 
285  for (p = 0; p < 3; p++) {
286  if (planes[p].bands)
287  for (b = 0; b < planes[p].num_bands; b++) {
288  av_freep(&planes[p].bands[b].bufs[0]);
289  av_freep(&planes[p].bands[b].bufs[1]);
290  av_freep(&planes[p].bands[b].bufs[2]);
291  av_freep(&planes[p].bands[b].bufs[3]);
292 
293  if (planes[p].bands[b].blk_vlc.cust_tab.table)
294  ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
295  for (t = 0; t < planes[p].bands[b].num_tiles; t++)
296  av_freep(&planes[p].bands[b].tiles[t].mbs);
297  av_freep(&planes[p].bands[b].tiles);
298  }
299  av_freep(&planes[p].bands);
300  planes[p].num_bands = 0;
301  }
302 }
303 
305  int is_indeo4)
306 {
307  int p, b;
308  uint32_t b_width, b_height, align_fac, width_aligned,
309  height_aligned, buf_size;
310  IVIBandDesc *band;
311 
313 
314  if (av_image_check_size2(cfg->pic_width, cfg->pic_height, avctx->max_pixels, AV_PIX_FMT_YUV410P, 0, avctx) < 0 ||
315  cfg->luma_bands < 1 || cfg->chroma_bands < 1)
316  return AVERROR_INVALIDDATA;
317 
318  /* fill in the descriptor of the luminance plane */
319  planes[0].width = cfg->pic_width;
320  planes[0].height = cfg->pic_height;
321  planes[0].num_bands = cfg->luma_bands;
322 
323  /* fill in the descriptors of the chrominance planes */
324  planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
325  planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
326  planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
327 
328  for (p = 0; p < 3; p++) {
329  planes[p].bands = av_mallocz_array(planes[p].num_bands, sizeof(IVIBandDesc));
330  if (!planes[p].bands)
331  return AVERROR(ENOMEM);
332 
333  /* select band dimensions: if there is only one band then it
334  * has the full size, if there are several bands each of them
335  * has only half size */
336  b_width = planes[p].num_bands == 1 ? planes[p].width
337  : (planes[p].width + 1) >> 1;
338  b_height = planes[p].num_bands == 1 ? planes[p].height
339  : (planes[p].height + 1) >> 1;
340 
341  /* luma band buffers will be aligned on 16x16 (max macroblock size) */
342  /* chroma band buffers will be aligned on 8x8 (max macroblock size) */
343  align_fac = p ? 8 : 16;
344  width_aligned = FFALIGN(b_width , align_fac);
345  height_aligned = FFALIGN(b_height, align_fac);
346  buf_size = width_aligned * height_aligned * sizeof(int16_t);
347 
348  for (b = 0; b < planes[p].num_bands; b++) {
349  band = &planes[p].bands[b]; /* select appropriate plane/band */
350  band->plane = p;
351  band->band_num = b;
352  band->width = b_width;
353  band->height = b_height;
354  band->pitch = width_aligned;
355  band->aheight = height_aligned;
356  av_assert0(!band->bufs[0] && !band->bufs[1] &&
357  !band->bufs[2] && !band->bufs[3]);
358  band->bufsize = buf_size/2;
359  av_assert0(buf_size % 2 == 0);
360 
361  /* reset custom vlc */
362  planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
363  }
364  }
365 
366  return 0;
367 }
368 
369 static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile,
370  int p, int b, int t_height, int t_width)
371 {
372  int x, y;
373  IVITile *tile = band->tiles;
374 
375  for (y = 0; y < band->height; y += t_height) {
376  for (x = 0; x < band->width; x += t_width) {
377  tile->xpos = x;
378  tile->ypos = y;
379  tile->mb_size = band->mb_size;
380  tile->width = FFMIN(band->width - x, t_width);
381  tile->height = FFMIN(band->height - y, t_height);
382  tile->is_empty = tile->data_size = 0;
383  /* calculate number of macroblocks */
384  tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
385  band->mb_size);
386 
387  av_freep(&tile->mbs);
388  tile->mbs = av_mallocz_array(tile->num_MBs, sizeof(IVIMbInfo));
389  if (!tile->mbs)
390  return AVERROR(ENOMEM);
391 
392  tile->ref_mbs = 0;
393  if (p || b) {
394  if (tile->num_MBs != ref_tile->num_MBs) {
395  av_log(NULL, AV_LOG_DEBUG, "ref_tile mismatch\n");
396  return AVERROR_INVALIDDATA;
397  }
398  tile->ref_mbs = ref_tile->mbs;
399  ref_tile++;
400  }
401  tile++;
402  }
403  }
404 
405  return 0;
406 }
407 
409  int tile_width, int tile_height)
410 {
411  int p, b, x_tiles, y_tiles, t_width, t_height, ret;
412  IVIBandDesc *band;
413 
414  for (p = 0; p < 3; p++) {
415  t_width = !p ? tile_width : (tile_width + 3) >> 2;
416  t_height = !p ? tile_height : (tile_height + 3) >> 2;
417 
418  if (!p && planes[0].num_bands == 4) {
419  if (t_width % 2 || t_height % 2) {
420  avpriv_request_sample(NULL, "Odd tiles");
421  return AVERROR_PATCHWELCOME;
422  }
423  t_width >>= 1;
424  t_height >>= 1;
425  }
426  if(t_width<=0 || t_height<=0)
427  return AVERROR(EINVAL);
428 
429  for (b = 0; b < planes[p].num_bands; b++) {
430  band = &planes[p].bands[b];
431 
432  if (band->tiles) {
433  int t;
434  for (t = 0; t < band->num_tiles; t++) {
435  av_freep(&band->tiles[t].mbs);
436  }
437  }
438 
439  x_tiles = IVI_NUM_TILES(band->width, t_width);
440  y_tiles = IVI_NUM_TILES(band->height, t_height);
441  band->num_tiles = x_tiles * y_tiles;
442 
443  av_freep(&band->tiles);
444  band->tiles = av_mallocz_array(band->num_tiles, sizeof(IVITile));
445  if (!band->tiles) {
446  band->num_tiles = 0;
447  return AVERROR(ENOMEM);
448  }
449 
450  /* use the first luma band as reference for motion vectors
451  * and quant */
452  ret = ivi_init_tiles(band, planes[0].bands[0].tiles,
453  p, b, t_height, t_width);
454  if (ret < 0)
455  return ret;
456  }
457  }
458 
459  return 0;
460 }
461 
462 /*
463  * Decode size of the tile data.
464  * The size is stored as a variable-length field having the following format:
465  * if (tile_data_size < 255) than this field is only one byte long
466  * if (tile_data_size >= 255) than this field four is byte long: 0xFF X1 X2 X3
467  * where X1-X3 is size of the tile data
468  *
469  * @param[in,out] gb the GetBit context
470  * @return size of the tile data in bytes
471  */
473 {
474  int len;
475 
476  len = 0;
477  if (get_bits1(gb)) {
478  len = get_bits(gb, 8);
479  if (len == 255)
480  len = get_bits(gb, 24);
481  }
482 
483  /* align the bitstream reader on the byte boundary */
484  align_get_bits(gb);
485 
486  return len;
487 }
488 
489 static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs,
490  int blk_size)
491 {
492  band->dc_transform(prev_dc, band->buf + buf_offs,
493  band->pitch, blk_size);
494 
495  return 0;
496 }
497 
500  int mv_x, int mv_y,
501  int mv_x2, int mv_y2,
502  int *prev_dc, int is_intra,
503  int mc_type, int mc_type2,
504  uint32_t quant, int offs,
505  AVCodecContext *avctx)
506 {
507  const uint16_t *base_tab = is_intra ? band->intra_base : band->inter_base;
508  RVMapDesc *rvmap = band->rv_map;
509  uint8_t col_flags[8];
510  int32_t trvec[64];
511  uint32_t sym = 0, lo, hi, q;
512  int pos, run, val;
513  int blk_size = band->blk_size;
514  int num_coeffs = blk_size * blk_size;
515  int col_mask = blk_size - 1;
516  int scan_pos = -1;
517  int min_size = band->pitch * (band->transform_size - 1) +
518  band->transform_size;
519  int buf_size = band->pitch * band->aheight - offs;
520 
521  if (min_size > buf_size)
522  return AVERROR_INVALIDDATA;
523 
524  if (!band->scan) {
525  av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
526  return AVERROR_INVALIDDATA;
527  }
528 
529  /* zero transform vector */
530  memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
531  /* zero column flags */
532  memset(col_flags, 0, sizeof(col_flags));
533  while (scan_pos <= num_coeffs) {
534  sym = get_vlc2(gb, band->blk_vlc.tab->table,
535  IVI_VLC_BITS, 1);
536  if (sym == rvmap->eob_sym)
537  break; /* End of block */
538 
539  /* Escape - run/val explicitly coded using 3 vlc codes */
540  if (sym == rvmap->esc_sym) {
541  run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
542  lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
543  hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
544  /* merge them and convert into signed val */
545  val = IVI_TOSIGNED((hi << 6) | lo);
546  } else {
547  if (sym >= 256U) {
548  av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %"PRIu32".\n", sym);
549  return AVERROR_INVALIDDATA;
550  }
551  run = rvmap->runtab[sym];
552  val = rvmap->valtab[sym];
553  }
554 
555  /* de-zigzag and dequantize */
556  scan_pos += run;
557  if (scan_pos >= num_coeffs || scan_pos < 0)
558  break;
559  pos = band->scan[scan_pos];
560 
561  if (!val)
562  ff_dlog(avctx, "Val = 0 encountered!\n");
563 
564  q = (base_tab[pos] * quant) >> 9;
565  if (q > 1)
566  val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
567  trvec[pos] = val;
568  /* track columns containing non-zero coeffs */
569  col_flags[pos & col_mask] |= !!val;
570  }
571 
572  if (scan_pos < 0 || scan_pos >= num_coeffs && sym != rvmap->eob_sym)
573  return AVERROR_INVALIDDATA; /* corrupt block data */
574 
575  /* undoing DC coeff prediction for intra-blocks */
576  if (is_intra && band->is_2d_trans) {
577  *prev_dc += trvec[0];
578  trvec[0] = *prev_dc;
579  col_flags[0] |= !!*prev_dc;
580  }
581 
582  if(band->transform_size > band->blk_size){
583  av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
584  return AVERROR_INVALIDDATA;
585  }
586 
587  /* apply inverse transform */
588  band->inv_transform(trvec, band->buf + offs,
589  band->pitch, col_flags);
590 
591  /* apply motion compensation */
592  if (!is_intra)
593  return ivi_mc(band, mc, mc_avg, offs, mv_x, mv_y, mv_x2, mv_y2,
594  mc_type, mc_type2);
595 
596  return 0;
597 }
598 /*
599  * Decode block data:
600  * extract huffman-coded transform coefficients from the bitstream,
601  * dequantize them, apply inverse transform and motion compensation
602  * in order to reconstruct the picture.
603  *
604  * @param[in,out] gb the GetBit context
605  * @param[in] band pointer to the band descriptor
606  * @param[in] tile pointer to the tile descriptor
607  * @return result code: 0 - OK, -1 = error (corrupted blocks data)
608  */
609 static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band,
610  IVITile *tile, AVCodecContext *avctx)
611 {
612  int mbn, blk, num_blocks, blk_size, ret, is_intra;
613  int mc_type = 0, mc_type2 = -1;
614  int mv_x = 0, mv_y = 0, mv_x2 = 0, mv_y2 = 0;
615  int32_t prev_dc;
616  uint32_t cbp, quant, buf_offs;
617  IVIMbInfo *mb;
618  ivi_mc_func mc_with_delta_func, mc_no_delta_func;
619  ivi_mc_avg_func mc_avg_with_delta_func, mc_avg_no_delta_func;
620  const uint8_t *scale_tab;
621 
622  /* init intra prediction for the DC coefficient */
623  prev_dc = 0;
624  blk_size = band->blk_size;
625  /* number of blocks per mb */
626  num_blocks = (band->mb_size != blk_size) ? 4 : 1;
627  if (blk_size == 8) {
628  mc_with_delta_func = ff_ivi_mc_8x8_delta;
629  mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
630  mc_avg_with_delta_func = ff_ivi_mc_avg_8x8_delta;
631  mc_avg_no_delta_func = ff_ivi_mc_avg_8x8_no_delta;
632  } else {
633  mc_with_delta_func = ff_ivi_mc_4x4_delta;
634  mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
635  mc_avg_with_delta_func = ff_ivi_mc_avg_4x4_delta;
636  mc_avg_no_delta_func = ff_ivi_mc_avg_4x4_no_delta;
637  }
638 
639  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
640  is_intra = !mb->type;
641  cbp = mb->cbp;
642  buf_offs = mb->buf_offs;
643 
644  quant = band->glob_quant + mb->q_delta;
645  if (avctx->codec_id == AV_CODEC_ID_INDEO4)
646  quant = av_clip_uintp2(quant, 5);
647  else
648  quant = av_clip(quant, 0, 23);
649 
650  scale_tab = is_intra ? band->intra_scale : band->inter_scale;
651  if (scale_tab)
652  quant = scale_tab[quant];
653 
654  if (!is_intra) {
655  mv_x = mb->mv_x;
656  mv_y = mb->mv_y;
657  mv_x2 = mb->b_mv_x;
658  mv_y2 = mb->b_mv_y;
659  if (band->is_halfpel) {
660  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
661  mc_type2 = ((mv_y2 & 1) << 1) | (mv_x2 & 1);
662  mv_x >>= 1;
663  mv_y >>= 1;
664  mv_x2 >>= 1;
665  mv_y2 >>= 1; /* convert halfpel vectors into fullpel ones */
666  }
667  if (mb->type == 2)
668  mc_type = -1;
669  if (mb->type != 2 && mb->type != 3)
670  mc_type2 = -1;
671  if (mb->type) {
672  int dmv_x, dmv_y, cx, cy;
673 
674  dmv_x = mb->mv_x >> band->is_halfpel;
675  dmv_y = mb->mv_y >> band->is_halfpel;
676  cx = mb->mv_x & band->is_halfpel;
677  cy = mb->mv_y & band->is_halfpel;
678 
679  if (mb->xpos + dmv_x < 0 ||
680  mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
681  mb->ypos + dmv_y < 0 ||
682  mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
683  return AVERROR_INVALIDDATA;
684  }
685  }
686  if (mb->type == 2 || mb->type == 3) {
687  int dmv_x, dmv_y, cx, cy;
688 
689  dmv_x = mb->b_mv_x >> band->is_halfpel;
690  dmv_y = mb->b_mv_y >> band->is_halfpel;
691  cx = mb->b_mv_x & band->is_halfpel;
692  cy = mb->b_mv_y & band->is_halfpel;
693 
694  if (mb->xpos + dmv_x < 0 ||
695  mb->xpos + dmv_x + band->mb_size + cx > band->pitch ||
696  mb->ypos + dmv_y < 0 ||
697  mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
698  return AVERROR_INVALIDDATA;
699  }
700  }
701  }
702 
703  for (blk = 0; blk < num_blocks; blk++) {
704  /* adjust block position in the buffer according to its number */
705  if (blk & 1) {
706  buf_offs += blk_size;
707  } else if (blk == 2) {
708  buf_offs -= blk_size;
709  buf_offs += blk_size * band->pitch;
710  }
711 
712  if (cbp & 1) { /* block coded ? */
713  ret = ivi_decode_coded_blocks(gb, band, mc_with_delta_func,
714  mc_avg_with_delta_func,
715  mv_x, mv_y, mv_x2, mv_y2,
716  &prev_dc, is_intra,
717  mc_type, mc_type2, quant,
718  buf_offs, avctx);
719  if (ret < 0)
720  return ret;
721  } else {
722  int buf_size = band->pitch * band->aheight - buf_offs;
723  int min_size = (blk_size - 1) * band->pitch + blk_size;
724 
725  if (min_size > buf_size)
726  return AVERROR_INVALIDDATA;
727  /* block not coded */
728  /* for intra blocks apply the dc slant transform */
729  /* for inter - perform the motion compensation without delta */
730  if (is_intra) {
731  ret = ivi_dc_transform(band, &prev_dc, buf_offs, blk_size);
732  if (ret < 0)
733  return ret;
734  } else {
735  ret = ivi_mc(band, mc_no_delta_func, mc_avg_no_delta_func,
736  buf_offs, mv_x, mv_y, mv_x2, mv_y2,
737  mc_type, mc_type2);
738  if (ret < 0)
739  return ret;
740  }
741  }
742 
743  cbp >>= 1;
744  }// for blk
745  }// for mbn
746 
747  align_get_bits(gb);
748 
749  return 0;
750 }
751 
752 /**
753  * Handle empty tiles by performing data copying and motion
754  * compensation respectively.
755  *
756  * @param[in] avctx ptr to the AVCodecContext
757  * @param[in] band pointer to the band descriptor
758  * @param[in] tile pointer to the tile descriptor
759  * @param[in] mv_scale scaling factor for motion vectors
760  */
761 static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band,
762  IVITile *tile, int32_t mv_scale)
763 {
764  int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
765  int offs, mb_offset, row_offset, ret;
766  IVIMbInfo *mb, *ref_mb;
767  const int16_t *src;
768  int16_t *dst;
769  ivi_mc_func mc_no_delta_func;
770  int clear_first = !band->qdelta_present && !band->plane && !band->band_num;
771  int mb_size = band->mb_size;
772  int xend = tile->xpos + tile->width;
773  int is_halfpel = band->is_halfpel;
774  int pitch = band->pitch;
775 
776  if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, mb_size)) {
777  av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
778  "parameters %d in ivi_process_empty_tile()\n",
779  tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, mb_size));
780  return AVERROR_INVALIDDATA;
781  }
782 
783  offs = tile->ypos * pitch + tile->xpos;
784  mb = tile->mbs;
785  ref_mb = tile->ref_mbs;
786  row_offset = mb_size * pitch;
787  need_mc = 0; /* reset the mc tracking flag */
788 
789  for (y = tile->ypos; y < (tile->ypos + tile->height); y += mb_size) {
790  mb_offset = offs;
791 
792  for (x = tile->xpos; x < xend; x += mb_size) {
793  mb->xpos = x;
794  mb->ypos = y;
795  mb->buf_offs = mb_offset;
796 
797  mb->type = 1; /* set the macroblocks type = INTER */
798  mb->cbp = 0; /* all blocks are empty */
799 
800  if (clear_first) {
801  mb->q_delta = band->glob_quant;
802  mb->mv_x = 0;
803  mb->mv_y = 0;
804  }
805 
806  if (ref_mb) {
807  if (band->inherit_qdelta)
808  mb->q_delta = ref_mb->q_delta;
809 
810  if (band->inherit_mv) {
811  /* motion vector inheritance */
812  if (mv_scale) {
813  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
814  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
815  } else {
816  mb->mv_x = ref_mb->mv_x;
817  mb->mv_y = ref_mb->mv_y;
818  }
819  need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
820  {
821  int dmv_x, dmv_y, cx, cy;
822 
823  dmv_x = mb->mv_x >> is_halfpel;
824  dmv_y = mb->mv_y >> is_halfpel;
825  cx = mb->mv_x & is_halfpel;
826  cy = mb->mv_y & is_halfpel;
827 
828  if ( mb->xpos + dmv_x < 0
829  || mb->xpos + dmv_x + mb_size + cx > pitch
830  || mb->ypos + dmv_y < 0
831  || mb->ypos + dmv_y + mb_size + cy > band->aheight) {
832  av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
833  return AVERROR_INVALIDDATA;
834  }
835  }
836  }
837  ref_mb++;
838  }
839 
840  mb++;
841  mb_offset += mb_size;
842  } // for x
843  offs += row_offset;
844  } // for y
845 
846  if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
847  num_blocks = (mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
848  mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
850 
851  for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
852  mv_x = mb->mv_x;
853  mv_y = mb->mv_y;
854  if (!band->is_halfpel) {
855  mc_type = 0; /* we have only fullpel vectors */
856  } else {
857  mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
858  mv_x >>= 1;
859  mv_y >>= 1; /* convert halfpel vectors into fullpel ones */
860  }
861 
862  for (blk = 0; blk < num_blocks; blk++) {
863  /* adjust block position in the buffer according with its number */
864  offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * pitch);
865  ret = ivi_mc(band, mc_no_delta_func, 0, offs,
866  mv_x, mv_y, 0, 0, mc_type, -1);
867  if (ret < 0)
868  return ret;
869  }
870  }
871  } else {
872  /* copy data from the reference tile into the current one */
873  src = band->ref_buf + tile->ypos * pitch + tile->xpos;
874  dst = band->buf + tile->ypos * pitch + tile->xpos;
875  for (y = 0; y < tile->height; y++) {
876  memcpy(dst, src, tile->width*sizeof(band->buf[0]));
877  src += pitch;
878  dst += pitch;
879  }
880  }
881 
882  return 0;
883 }
884 
885 
886 #ifdef DEBUG
887 static uint16_t ivi_calc_band_checksum(const IVIBandDesc *band)
888 {
889  int x, y;
890  int16_t *src, checksum;
891 
892  src = band->buf;
893  checksum = 0;
894 
895  for (y = 0; y < band->height; src += band->pitch, y++)
896  for (x = 0; x < band->width; x++)
897  checksum += src[x];
898 
899  return checksum;
900 }
901 #endif
902 
903 /*
904  * Convert and output the current plane.
905  * This conversion is done by adding back the bias value of 128
906  * (subtracted in the encoder) and clipping the result.
907  *
908  * @param[in] plane pointer to the descriptor of the plane being processed
909  * @param[out] dst pointer to the buffer receiving converted pixels
910  * @param[in] dst_pitch pitch for moving to the next y line
911  */
912 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
913 {
914  int x, y;
915  const int16_t *src = plane->bands[0].buf;
916  ptrdiff_t pitch = plane->bands[0].pitch;
917 
918  if (!src)
919  return;
920 
921  for (y = 0; y < plane->height; y++) {
922  int m = 0;
923  int w = plane->width;
924  for (x = 0; x < w; x++) {
925  int t = src[x] + 128;
926  dst[x] = t;
927  m |= t;
928  }
929  if (m & ~255)
930  for (x = 0; x < w; x++)
931  dst[x] = av_clip_uint8(src[x] + 128);
932  src += pitch;
933  dst += dst_pitch;
934  }
935 }
936 
937 static void *prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
938 {
939  if (ctx->pic_conf.luma_bands <= 1 && i == 2)
940  return NULL;
941  if (!band->bufs[i])
942  band->bufs[i] = av_mallocz(2 * band->bufsize);
943  return band->bufs[i];
944 }
945 
946 /**
947  * Decode an Indeo 4 or 5 band.
948  *
949  * @param[in,out] ctx ptr to the decoder context
950  * @param[in,out] band ptr to the band descriptor
951  * @param[in] avctx ptr to the AVCodecContext
952  * @return result code: 0 = OK, -1 = error
953  */
955  IVIBandDesc *band, AVCodecContext *avctx)
956 {
957  int result, i, t, idx1, idx2, pos;
958  IVITile *tile;
959 
960  band->buf = prepare_buf(ctx, band, ctx->dst_buf);
961  if (!band->buf) {
962  av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
963  return AVERROR_INVALIDDATA;
964  }
965  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
966  band->ref_buf = prepare_buf(ctx, band, ctx->b_ref_buf);
967  band->b_ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
968  if (!band->b_ref_buf)
969  return AVERROR(ENOMEM);
970  } else {
971  band->ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
972  band->b_ref_buf = 0;
973  }
974  if (!band->ref_buf)
975  return AVERROR(ENOMEM);
976  band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
977 
978  result = ctx->decode_band_hdr(ctx, band, avctx);
979  if (result) {
980  av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
981  result);
982  return result;
983  }
984 
985  if (band->is_empty) {
986  av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
987  return AVERROR_INVALIDDATA;
988  }
989 
990  band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
991 
992  /* apply corrections to the selected rvmap table if present */
993  for (i = 0; i < band->num_corr; i++) {
994  idx1 = band->corr[i * 2];
995  idx2 = band->corr[i * 2 + 1];
996  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
997  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
998  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
999  band->rv_map->eob_sym ^= idx1 ^ idx2;
1000  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1001  band->rv_map->esc_sym ^= idx1 ^ idx2;
1002  }
1003 
1004  pos = get_bits_count(&ctx->gb);
1005 
1006  for (t = 0; t < band->num_tiles; t++) {
1007  tile = &band->tiles[t];
1008 
1009  if (tile->mb_size != band->mb_size) {
1010  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
1011  band->mb_size, tile->mb_size);
1012  return AVERROR_INVALIDDATA;
1013  }
1014  tile->is_empty = get_bits1(&ctx->gb);
1015  if (tile->is_empty) {
1016  result = ivi_process_empty_tile(avctx, band, tile,
1017  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1018  if (result < 0)
1019  break;
1020  ff_dlog(avctx, "Empty tile encountered!\n");
1021  } else {
1022  tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1023  if (!tile->data_size) {
1024  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1026  break;
1027  }
1028 
1029  result = ctx->decode_mb_info(ctx, band, tile, avctx);
1030  if (result < 0)
1031  break;
1032 
1033  result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1034  if (result < 0) {
1035  av_log(avctx, AV_LOG_ERROR,
1036  "Corrupted tile data encountered!\n");
1037  break;
1038  }
1039 
1040  if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1041  av_log(avctx, AV_LOG_ERROR,
1042  "Tile data_size mismatch!\n");
1044  break;
1045  }
1046 
1047  pos += tile->data_size << 3; // skip to next tile
1048  }
1049  }
1050 
1051  /* restore the selected rvmap table by applying its corrections in
1052  * reverse order */
1053  for (i = band->num_corr-1; i >= 0; i--) {
1054  idx1 = band->corr[i*2];
1055  idx2 = band->corr[i*2+1];
1056  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1057  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1058  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1059  band->rv_map->eob_sym ^= idx1 ^ idx2;
1060  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1061  band->rv_map->esc_sym ^= idx1 ^ idx2;
1062  }
1063 
1064 #ifdef DEBUG
1065  if (band->checksum_present) {
1066  uint16_t chksum = ivi_calc_band_checksum(band);
1067  if (chksum != band->checksum) {
1068  av_log(avctx, AV_LOG_ERROR,
1069  "Band checksum mismatch! Plane %d, band %d, "
1070  "received: %"PRIx32", calculated: %"PRIx16"\n",
1071  band->plane, band->band_num, band->checksum, chksum);
1072  }
1073  }
1074 #endif
1075 
1076  align_get_bits(&ctx->gb);
1077 
1078  return result;
1079 }
1080 
1081 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1082  AVPacket *avpkt)
1083 {
1084  IVI45DecContext *ctx = avctx->priv_data;
1085  const uint8_t *buf = avpkt->data;
1086  AVFrame *frame = data;
1087  int buf_size = avpkt->size;
1088  int result, p, b;
1089 
1090  result = init_get_bits8(&ctx->gb, buf, buf_size);
1091  if (result < 0)
1092  return result;
1093  ctx->frame_data = buf;
1094  ctx->frame_size = buf_size;
1095 
1096  result = ctx->decode_pic_hdr(ctx, avctx);
1097  if (result) {
1098  av_log(avctx, AV_LOG_ERROR,
1099  "Error while decoding picture header: %d\n", result);
1100  return result;
1101  }
1102  if (ctx->gop_invalid)
1103  return AVERROR_INVALIDDATA;
1104 
1105  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1106  if (ctx->got_p_frame) {
1107  av_frame_move_ref(data, ctx->p_frame);
1108  *got_frame = 1;
1109  ctx->got_p_frame = 0;
1110  } else {
1111  *got_frame = 0;
1112  }
1113  return buf_size;
1114  }
1115 
1116  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1117  avpriv_report_missing_feature(avctx, "Password-protected clip");
1118  return AVERROR_PATCHWELCOME;
1119  }
1120 
1121  if (!ctx->planes[0].bands) {
1122  av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1123  return AVERROR_INVALIDDATA;
1124  }
1125 
1126  ctx->switch_buffers(ctx);
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  if (!ctx->is_nonnull_frame(ctx))
1154  return buf_size;
1155 
1156  result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1157  if (result < 0)
1158  return result;
1159 
1160  if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1161  return result;
1162 
1163  if (ctx->is_scalable) {
1164  if (ctx->is_indeo4)
1165  ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1166  else
1167  ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1168  } else {
1169  ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1170  }
1171 
1172  ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1173  ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1174 
1175  *got_frame = 1;
1176 
1177  /* If the bidirectional mode is enabled, next I and the following P
1178  * frame will be sent together. Unfortunately the approach below seems
1179  * to be the only way to handle the B-frames mode.
1180  * That's exactly the same Intel decoders do.
1181  */
1182  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1183  int left;
1184 
1185  // skip version string
1186  while (get_bits(&ctx->gb, 8)) {
1187  if (get_bits_left(&ctx->gb) < 8)
1188  return AVERROR_INVALIDDATA;
1189  }
1190  left = get_bits_count(&ctx->gb) & 0x18;
1191  skip_bits_long(&ctx->gb, 64 - left);
1192  if (get_bits_left(&ctx->gb) > 18 &&
1193  show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1194  AVPacket pkt;
1195  pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1196  pkt.size = get_bits_left(&ctx->gb) >> 3;
1197  ctx->got_p_frame = 0;
1198  av_frame_unref(ctx->p_frame);
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 };
ff_ivi_mc_4x4_no_delta
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
ivi_process_empty_tile
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:761
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
RVMapDesc::runtab
uint8_t runtab[256]
Definition: ivi.h:100
IVITile::height
int height
Definition: ivi.h:131
RVMapDesc::valtab
int8_t valtab[256]
Definition: ivi.h:101
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
AVERROR
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
IVIHuffDesc::xbits
uint8_t xbits[16]
Definition: ivi.h:57
FFSWAP
#define FFSWAP(type, a, b)
Definition: common.h:99
cb
static double cb(void *priv, double x, double y)
Definition: vf_geq.c:215
IVIBandDesc::inter_scale
const uint8_t * inter_scale
quantization coefficient for inter blocks
Definition: ivi.h:187
ff_ivi_init_static_vlc
av_cold void ff_ivi_init_static_vlc(void)
Initialize static codes used for macroblock and block decoding.
Definition: ivi.c:178
IVIPicConfig::pic_width
uint16_t pic_width
Definition: ivi.h:203
IVIBandDesc::height
int height
Definition: ivi.h:148
IVIHuffDesc
huffman codebook descriptor
Definition: ivi.h:55
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
ivi_decode_blocks
static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi.c:609
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
decode_band
static int decode_band(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Decode an Indeo 4 or 5 band.
Definition: ivi.c:954
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
IVIBandDesc::inv_transform
InvTransformPtr * inv_transform
Definition: ivi.h:177
w
uint8_t w
Definition: llviddspenc.c:38
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:355
init_vlc
#define init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:38
b
#define b
Definition: input.c:41
ff_reverse
const uint8_t ff_reverse[256]
Definition: reverse.c:23
data
const char data[16]
Definition: mxf.c:91
RVMapDesc::eob_sym
uint8_t eob_sym
end of block symbol
Definition: ivi.h:98
av_mallocz_array
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:190
get_vlc2
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
table_data
static VLC_TYPE table_data[117592][2]
Definition: rv34.c:99
ff_ivi_mc_avg_4x4_no_delta
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
IVIBandDesc::rvmap_sel
int rvmap_sel
rvmap table selector
Definition: ivi.h:173
IVIBandDesc::dc_transform
DCTransformPtr * dc_transform
Definition: ivi.h:179
IVIHuffTab::tab
VLC * tab
index of one of the predefined tables or "7" for custom one
Definition: ivi.h:66
ivi_scale_mv
static int ivi_scale_mv(int mv, int mv_scale)
scale motion vector
Definition: ivi.h:293
INIT_VLC_LE
#define INIT_VLC_LE
Definition: vlc.h:54
ivi_dsp.h
IVITile::num_MBs
int num_MBs
number of macroblocks in this tile
Definition: ivi.h:135
IVIPicConfig::luma_bands
uint8_t luma_bands
Definition: ivi.h:209
IVI_TOSIGNED
#define IVI_TOSIGNED(val)
convert unsigned values into signed ones (the sign is in the LSB)
Definition: ivi.h:290
IVIBandDesc::data_ptr
const uint8_t * data_ptr
ptr to the first byte of the band data
Definition: ivi.h:150
IVI4_FRAMETYPE_BIDIR
@ IVI4_FRAMETYPE_BIDIR
bidirectional frame
Definition: ivi.h:43
IVITile::is_empty
int is_empty
= 1 if this tile doesn't contain any data
Definition: ivi.h:133
ivi.h
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
ivi_blk_huff_desc
static const IVIHuffDesc ivi_blk_huff_desc[8]
static block huffman tables
Definition: ivi.c:61
IVIBandDesc::num_corr
int num_corr
number of correction entries
Definition: ivi.h:171
VLC_TYPE
#define VLC_TYPE
Definition: vlc.h:24
U
#define U(x)
Definition: vp56_arith.h:37
IVIBandDesc
information for Indeo wavelet band
Definition: ivi.h:144
IVIPlaneDesc::height
uint16_t height
Definition: ivi.h:196
FFSIGN
#define FFSIGN(a)
Definition: common.h:73
ff_ivi_decode_close
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
Close Indeo5 decoder and clean up its context.
Definition: ivi.c:1225
GetBitContext
Definition: get_bits.h:61
IVI5_IS_PROTECTED
#define IVI5_IS_PROTECTED
Definition: ivi.h:50
val
static double val(void *priv, double ch)
Definition: aeval.c:76
IVIHuffTab
macroblock/block huffman table descriptor
Definition: ivi.h:63
IVITile::width
int width
Definition: ivi.h:130
IVIBandDesc::tiles
IVITile * tiles
array of tile descriptors
Definition: ivi.h:176
IVIHuffDesc::num_rows
int32_t num_rows
Definition: ivi.h:56
IVIBandDesc::intra_base
const uint16_t * intra_base
quantization matrix for intra blocks
Definition: ivi.h:184
av_image_check_size2
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
IVI_MBs_PER_TILE
#define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size)
calculate number of macroblocks in a tile
Definition: ivi.h:286
IVIMbInfo
information for Indeo macroblock (16x16, 8x8 or 4x4)
Definition: ivi.h:110
ivi_create_huff_from_desc
static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
Definition: ivi.c:144
IVIHuffTab::tab_sel
int32_t tab_sel
Definition: ivi.h:64
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
IVI_VLC_BITS
#define IVI_VLC_BITS
max number of bits of the ivi's huffman codes
Definition: ivi.h:49
IVITile::ypos
int ypos
Definition: ivi.h:129
IVIBandDesc::checksum_present
int checksum_present
Definition: ivi.h:182
IVIBandDesc::width
int width
Definition: ivi.h:147
IVIBandDesc::num_tiles
int num_tiles
number of tiles in this band
Definition: ivi.h:175
ivi_mb_huff_desc
static const IVIHuffDesc ivi_mb_huff_desc[8]
These are 2x8 predefined Huffman codebooks for coding macroblock/block signals.
Definition: ivi.c:49
IVIMbInfo::mv_x
int8_t mv_x
motion vector (x component)
Definition: ivi.h:117
IVIBandDesc::ref_buf
int16_t * ref_buf
pointer to the reference frame buffer (for motion compensation)
Definition: ivi.h:153
IVIPicConfig::chroma_bands
uint8_t chroma_bands
Definition: ivi.h:210
bits
uint8_t bits
Definition: vp3data.h:202
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
ivi_mb_vlc_tabs
static VLC ivi_mb_vlc_tabs[8]
static macroblock Huffman tables
Definition: ivi.c:72
IVIPicConfig
Definition: ivi.h:202
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
ctx
AVFormatContext * ctx
Definition: movenc.c:48
get_bits.h
IVIBandDesc::scan
const uint8_t * scan
ptr to the scan pattern
Definition: ivi.h:166
ff_free_vlc
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:359
AVCodecContext::max_pixels
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:2256
blk
#define blk(i)
Definition: sha.c:185
IVITile::data_size
int data_size
size of the data in bytes
Definition: ivi.h:134
IVIBandDesc::inter_base
const uint16_t * inter_base
quantization matrix for inter blocks
Definition: ivi.h:185
bands
static const float bands[]
Definition: af_superequalizer.c:56
IVIHuffTab::cust_desc
IVIHuffDesc cust_desc
pointer to the table associated with tab_sel
Definition: ivi.h:69
prepare_buf
static void * prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
Definition: ivi.c:937
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:536
int32_t
int32_t
Definition: audio_convert.c:194
if
if(ret)
Definition: filter_design.txt:179
ivi_huff_desc_cmp
static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
Definition: ivi.c:218
IVIPlaneDesc
color plane (luma or chroma) information
Definition: ivi.h:194
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
run
uint8_t run
Definition: svq3.c:209
ff_ivi_init_tiles
av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
Initialize tile and macroblock descriptors.
Definition: ivi.c:408
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
src
#define src
Definition: vp8dsp.c:254
IVIBandDesc::inherit_mv
int inherit_mv
tells if motion vector is inherited from reference macroblock
Definition: ivi.h:161
mathops.h
IVIBandDesc::band_num
int band_num
band number
Definition: ivi.h:146
INIT_VLC_USE_NEW_STATIC
#define INIT_VLC_USE_NEW_STATIC
Definition: vlc.h:55
ff_ivi_recompose53
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
IVIPicConfig::pic_height
uint16_t pic_height
Definition: ivi.h:204
IVIBandDesc::aheight
int aheight
aligned band height
Definition: ivi.h:149
IVI45DecContext
Definition: ivi.h:213
ivi_huff_desc_copy
static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
Definition: ivi.c:205
ivi_mc_func
void(* ivi_mc_func)(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
Definition: ivi.c:75
IVI4_FRAMETYPE_INTRA
@ IVI4_FRAMETYPE_INTRA
Definition: ivi.h:40
ivi_blk_vlc_tabs
static VLC ivi_blk_vlc_tabs[8]
static block Huffman tables
Definition: ivi.c:73
ff_ivi_vertical_scan_8x8
const uint8_t ff_ivi_vertical_scan_8x8[64]
Scan patterns shared between indeo4 and indeo5.
Definition: ivi.c:1246
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
VLC::table_allocated
int table_allocated
Definition: vlc.h:29
ff_ivi_horizontal_scan_8x8
const uint8_t ff_ivi_horizontal_scan_8x8[64]
Definition: ivi.c:1257
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1854
ff_ivi_rvmap_tabs
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi.c:1276
AVPacket::size
int size
Definition: packet.h:356
IVIBandDesc::checksum
int32_t checksum
for debug purposes
Definition: ivi.h:181
IVIPlaneDesc::width
uint16_t width
Definition: ivi.h:195
RVMapDesc
run-value (RLE) table descriptor
Definition: ivi.h:97
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
ff_ivi_init_planes
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:304
IVIBandDesc::plane
int plane
plane number this band belongs to
Definition: ivi.h:145
IVIBandDesc::transform_size
int transform_size
Definition: ivi.h:178
ivi_mc
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:81
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
IVIBandDesc::mb_size
int mb_size
macroblock size
Definition: ivi.h:158
attributes.h
AV_CODEC_ID_INDEO4
@ AV_CODEC_ID_INDEO4
Definition: codec_id.h:160
IVIBandDesc::bufs
int16_t * bufs[4]
array of pointers to the band buffers
Definition: ivi.h:155
ff_ivi_mc_avg_8x8_delta
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
mb
#define mb
Definition: vf_colormatrix.c:101
IVITile
information for Indeo tile
Definition: ivi.h:127
ff_ivi_mc_avg_4x4_delta
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
planes
static const struct @315 planes[]
flag
#define flag(name)
Definition: cbs_av1.c:557
IVIBandDesc::intra_scale
const uint8_t * intra_scale
quantization coefficient for intra blocks
Definition: ivi.h:186
IVITile::mbs
IVIMbInfo * mbs
array of macroblock descriptors
Definition: ivi.h:136
ivi_free_buffers
static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
Definition: ivi.c:281
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
ff_ivi_mc_4x4_delta
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
IVIBandDesc::bufsize
int bufsize
band buffer size in bytes
Definition: ivi.h:183
show_bits
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
IVITile::mb_size
int mb_size
Definition: ivi.h:132
ivi_output_plane
static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
Definition: ivi.c:912
IVITile::ref_mbs
IVIMbInfo * ref_mbs
ptr to the macroblock descriptors of the reference tile
Definition: ivi.h:137
IVIBandDesc::buf
int16_t * buf
pointer to the output buffer for this band
Definition: ivi.h:152
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:583
ff_ivi_mc_8x8_delta
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
uint8_t
uint8_t
Definition: audio_convert.c:194
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:554
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
RVMapDesc::esc_sym
uint8_t esc_sym
escape symbol
Definition: ivi.h:99
len
int len
Definition: vorbis_enc_data.h:452
mv_scale
static av_always_inline void mv_scale(Mv *dst, Mv *src, int td, int tb)
Definition: hevc_mvs.c:115
IVIBandDesc::b_ref_buf
int16_t * b_ref_buf
pointer to the second reference frame buffer (for motion compensation)
Definition: ivi.h:154
IVIMbInfo::q_delta
int8_t q_delta
quant delta
Definition: ivi.h:116
avcodec.h
ff_ivi_recompose_haar
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
ret
ret
Definition: filter_design.txt:187
ff_ivi_mc_8x8_no_delta
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
IVI4_FRAMETYPE_NULL_LAST
@ IVI4_FRAMETYPE_NULL_LAST
empty frame with no data
Definition: ivi.h:46
frame
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
Definition: filter_design.txt:264
IVIBandDesc::qdelta_present
int qdelta_present
tells if Qdelta signal is present in the bitstream (Indeo5 only)
Definition: ivi.h:163
IVIBandDesc::rv_map
RVMapDesc * rv_map
ptr to the RLE table for this band
Definition: ivi.h:174
ff_ivi_direct_scan_4x4
const uint8_t ff_ivi_direct_scan_4x4[16]
Definition: ivi.c:1268
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:693
IVIBandDesc::is_2d_trans
int is_2d_trans
1 indicates that the two-dimensional inverse transform is used
Definition: ivi.h:180
pos
unsigned int pos
Definition: spdifenc.c:412
checksum
static volatile int checksum
Definition: adler32.c:30
left
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:386
IVI_NUM_TILES
#define IVI_NUM_TILES(stride, tile_size)
calculate number of tiles in a stride
Definition: ivi.h:283
ivi_mc_avg_func
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:77
IVIBandDesc::is_empty
int is_empty
= 1 if this band doesn't contain any data
Definition: ivi.h:157
AVCodecContext
main external API structure.
Definition: avcodec.h:526
ivi_dc_transform
static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs, int blk_size)
Definition: ivi.c:489
inv_bits
static uint16_t inv_bits(uint16_t val, int nbits)
Reverse "nbits" bits of the value "val" and return the result in the least significant bits.
Definition: ivi.c:122
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
VLC
Definition: vlc.h:26
IVIBandDesc::blk_size
int blk_size
block size
Definition: ivi.h:159
ivi_decode_coded_blocks
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:498
ff_ivi_mc_avg_8x8_no_delta
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
IVIPlaneDesc::bands
IVIBandDesc * bands
array of band descriptors
Definition: ivi.h:198
IVIBandDesc::blk_vlc
IVIHuffTab blk_vlc
vlc table for decoding block data
Definition: ivi.h:169
ff_set_dimensions
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
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
quant
const uint8_t * quant
Definition: vorbis_enc_data.h:458
ff_ivi_decode_frame
int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: ivi.c:1081
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:48
ff_ivi_dec_huff_desc
int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, IVIHuffTab *huff_tab, AVCodecContext *avctx)
Decode a huffman codebook descriptor from the bitstream and select specified huffman table.
Definition: ivi.c:225
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:553
AVPacket
This structure stores compressed data.
Definition: packet.h:332
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
IVIBandDesc::inherit_qdelta
int inherit_qdelta
tells if quantiser delta is inherited from reference macroblock
Definition: ivi.h:162
IVIBandDesc::corr
uint8_t corr[61 *2]
rvmap correction pairs
Definition: ivi.h:172
imgutils.h
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:72
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
IVITile::xpos
int xpos
Definition: ivi.h:128
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
IVIBandDesc::is_halfpel
int is_halfpel
precision of the motion compensation: 0 - fullpel, 1 - halfpel
Definition: ivi.h:160
ivi_init_tiles
static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile, int p, int b, int t_height, int t_width)
Definition: ivi.c:369
IVIBandDesc::glob_quant
int glob_quant
quant base for this band
Definition: ivi.h:165
VLC::table
VLC_TYPE(* table)[2]
code, bits
Definition: vlc.h:28
IVIBandDesc::pitch
ptrdiff_t pitch
pitch associated with the buffers above
Definition: ivi.h:156
mc
#define mc
Definition: vf_colormatrix.c:102
ivi_dec_tile_data_size
static int ivi_dec_tile_data_size(GetBitContext *gb)
Definition: ivi.c:472
IVIHuffTab::cust_tab
VLC cust_tab
custom Huffman codebook descriptor
Definition: ivi.h:70
IVIMbInfo::mv_y
int8_t mv_y
motion vector (y component)
Definition: ivi.h:118