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