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