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/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;
168  ivi_mb_vlc_tabs[i].table_allocated = 8192;
169  ivi_create_huff_from_desc(&ivi_mb_huff_desc[i],
170  &ivi_mb_vlc_tabs[i], 1);
171  ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
172  ivi_blk_vlc_tabs[i].table_allocated = 8192;
173  ivi_create_huff_from_desc(&ivi_blk_huff_desc[i],
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 
297  ivi_free_buffers(planes);
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  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
996  band->mb_size, tile->mb_size);
997  return AVERROR_INVALIDDATA;
998  }
999  tile->is_empty = get_bits1(&ctx->gb);
1000  if (tile->is_empty) {
1001  result = ivi_process_empty_tile(avctx, band, tile,
1002  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1003  if (result < 0)
1004  break;
1005  ff_dlog(avctx, "Empty tile encountered!\n");
1006  } else {
1007  tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1008  if (!tile->data_size) {
1009  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1010  result = AVERROR_INVALIDDATA;
1011  break;
1012  }
1013 
1014  result = ctx->decode_mb_info(ctx, band, tile, avctx);
1015  if (result < 0)
1016  break;
1017 
1018  result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1019  if (result < 0) {
1020  av_log(avctx, AV_LOG_ERROR,
1021  "Corrupted tile data encountered!\n");
1022  break;
1023  }
1024 
1025  if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1026  av_log(avctx, AV_LOG_ERROR,
1027  "Tile data_size mismatch!\n");
1028  result = AVERROR_INVALIDDATA;
1029  break;
1030  }
1031 
1032  pos += tile->data_size << 3; // skip to next tile
1033  }
1034  }
1035 
1036  /* restore the selected rvmap table by applying its corrections in
1037  * reverse order */
1038  for (i = band->num_corr-1; i >= 0; i--) {
1039  idx1 = band->corr[i*2];
1040  idx2 = band->corr[i*2+1];
1041  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1042  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1043  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1044  band->rv_map->eob_sym ^= idx1 ^ idx2;
1045  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1046  band->rv_map->esc_sym ^= idx1 ^ idx2;
1047  }
1048 
1049 #ifdef DEBUG
1050  if (band->checksum_present) {
1051  uint16_t chksum = ivi_calc_band_checksum(band);
1052  if (chksum != band->checksum) {
1053  av_log(avctx, AV_LOG_ERROR,
1054  "Band checksum mismatch! Plane %d, band %d, "
1055  "received: %"PRIx32", calculated: %"PRIx16"\n",
1056  band->plane, band->band_num, band->checksum, chksum);
1057  }
1058  }
1059 #endif
1060 
1061  align_get_bits(&ctx->gb);
1062 
1063  return result;
1064 }
1065 
1066 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
1067  AVPacket *avpkt)
1068 {
1069  IVI45DecContext *ctx = avctx->priv_data;
1070  const uint8_t *buf = avpkt->data;
1071  AVFrame *frame = data;
1072  int buf_size = avpkt->size;
1073  int result, p, b;
1074 
1075  result = init_get_bits8(&ctx->gb, buf, buf_size);
1076  if (result < 0)
1077  return result;
1078  ctx->frame_data = buf;
1079  ctx->frame_size = buf_size;
1080 
1081  result = ctx->decode_pic_hdr(ctx, avctx);
1082  if (result) {
1083  av_log(avctx, AV_LOG_ERROR,
1084  "Error while decoding picture header: %d\n", result);
1085  return result;
1086  }
1087  if (ctx->gop_invalid)
1088  return AVERROR_INVALIDDATA;
1089 
1090  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1091  if (ctx->got_p_frame) {
1092  av_frame_move_ref(data, ctx->p_frame);
1093  *got_frame = 1;
1094  ctx->got_p_frame = 0;
1095  } else {
1096  *got_frame = 0;
1097  }
1098  return buf_size;
1099  }
1100 
1101  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1102  avpriv_report_missing_feature(avctx, "Password-protected clip");
1103  return AVERROR_PATCHWELCOME;
1104  }
1105 
1106  if (!ctx->planes[0].bands) {
1107  av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1108  return AVERROR_INVALIDDATA;
1109  }
1110 
1111  ctx->switch_buffers(ctx);
1112 
1113  if (ctx->is_nonnull_frame(ctx)) {
1114  ctx->buf_invalid[ctx->dst_buf] = 1;
1115  for (p = 0; p < 3; p++) {
1116  for (b = 0; b < ctx->planes[p].num_bands; b++) {
1117  result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1118  if (result < 0) {
1119  av_log(avctx, AV_LOG_ERROR,
1120  "Error while decoding band: %d, plane: %d\n", b, p);
1121  return result;
1122  }
1123  }
1124  }
1125  ctx->buf_invalid[ctx->dst_buf] = 0;
1126  } else {
1127  if (ctx->is_scalable)
1128  return AVERROR_INVALIDDATA;
1129 
1130  for (p = 0; p < 3; p++) {
1131  if (!ctx->planes[p].bands[0].buf)
1132  return AVERROR_INVALIDDATA;
1133  }
1134  }
1135  if (ctx->buf_invalid[ctx->dst_buf])
1136  return -1;
1137 
1138  if (!ctx->is_nonnull_frame(ctx))
1139  return buf_size;
1140 
1141  result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1142  if (result < 0)
1143  return result;
1144 
1145  if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1146  return result;
1147 
1148  if (ctx->is_scalable) {
1149  if (ctx->is_indeo4)
1150  ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1151  else
1152  ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1153  } else {
1154  ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1155  }
1156 
1157  ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1158  ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1159 
1160  *got_frame = 1;
1161 
1162  /* If the bidirectional mode is enabled, next I and the following P
1163  * frame will be sent together. Unfortunately the approach below seems
1164  * to be the only way to handle the B-frames mode.
1165  * That's exactly the same Intel decoders do.
1166  */
1167  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1168  int left;
1169 
1170  // skip version string
1171  while (get_bits(&ctx->gb, 8)) {
1172  if (get_bits_left(&ctx->gb) < 8)
1173  return AVERROR_INVALIDDATA;
1174  }
1175  left = get_bits_count(&ctx->gb) & 0x18;
1176  skip_bits_long(&ctx->gb, 64 - left);
1177  if (get_bits_left(&ctx->gb) > 18 &&
1178  show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1179  AVPacket pkt;
1180  pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1181  pkt.size = get_bits_left(&ctx->gb) >> 3;
1182  ctx->got_p_frame = 0;
1183  av_frame_unref(ctx->p_frame);
1184  ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1185  }
1186  }
1187 
1188  if (ctx->show_indeo4_info) {
1189  if (ctx->is_scalable)
1190  av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1191  if (ctx->uses_tiling)
1192  av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1193  if (ctx->has_b_frames)
1194  av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1195  if (ctx->has_transp)
1196  av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1197  if (ctx->uses_haar)
1198  av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1199  if (ctx->uses_fullpel)
1200  av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1201  ctx->show_indeo4_info = 0;
1202  }
1203 
1204  return buf_size;
1205 }
1206 
1207 /**
1208  * Close Indeo5 decoder and clean up its context.
1209  */
1211 {
1212  IVI45DecContext *ctx = avctx->priv_data;
1213 
1214  ivi_free_buffers(&ctx->planes[0]);
1215 
1216  if (ctx->mb_vlc.cust_tab.table)
1217  ff_free_vlc(&ctx->mb_vlc.cust_tab);
1218 
1219  if (ctx->blk_vlc.cust_tab.table)
1220  ff_free_vlc(&ctx->blk_vlc.cust_tab);
1221 
1222  av_frame_free(&ctx->p_frame);
1223 
1224  return 0;
1225 }
1226 
1227 
1228 /**
1229  * Scan patterns shared between indeo4 and indeo5
1230  */
1232  0, 8, 16, 24, 32, 40, 48, 56,
1233  1, 9, 17, 25, 33, 41, 49, 57,
1234  2, 10, 18, 26, 34, 42, 50, 58,
1235  3, 11, 19, 27, 35, 43, 51, 59,
1236  4, 12, 20, 28, 36, 44, 52, 60,
1237  5, 13, 21, 29, 37, 45, 53, 61,
1238  6, 14, 22, 30, 38, 46, 54, 62,
1239  7, 15, 23, 31, 39, 47, 55, 63
1240 };
1241 
1243  0, 1, 2, 3, 4, 5, 6, 7,
1244  8, 9, 10, 11, 12, 13, 14, 15,
1245  16, 17, 18, 19, 20, 21, 22, 23,
1246  24, 25, 26, 27, 28, 29, 30, 31,
1247  32, 33, 34, 35, 36, 37, 38, 39,
1248  40, 41, 42, 43, 44, 45, 46, 47,
1249  48, 49, 50, 51, 52, 53, 54, 55,
1250  56, 57, 58, 59, 60, 61, 62, 63
1251 };
1252 
1254  0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1255 };
1256 
1257 
1258 /**
1259  * Run-value (RLE) tables.
1260  */
1262 { /* MapTab0 */
1263  5, /* eob_sym */
1264  2, /* esc_sym */
1265  /* run table */
1266  {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1267  1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1268  1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1269  8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1270  9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1271  2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1272  8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1273  2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1274  1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1275  6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1276  22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1277  4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1278  1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1279  1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1280  6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1281  30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1282 
1283  /* value table */
1284  { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1285  6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1286  10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1287  1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1288  -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1289  7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1290  2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1291  9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1292  28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1293  3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1294  -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1295  5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1296  -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1297  37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1298  5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1299  -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1300 },{
1301  /* MapTab1 */
1302  0, /* eob_sym */
1303  38, /* esc_sym */
1304  /* run table */
1305  {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1306  7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1307  14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1308  25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1309  33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1310  37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1311  40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1312  57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1313  52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1314  60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1315  12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1316  1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1317  21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1318  29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1319  28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1320  2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1321 
1322  /* value table */
1323  {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1324  -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1325  -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1326  1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1327  1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1328  1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1329  -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1330  -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1331  1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1332  1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1333  2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1334  6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1335  2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1336  2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1337  -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1338  -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1339 },{
1340  /* MapTab2 */
1341  2, /* eob_sym */
1342  11, /* esc_sym */
1343  /* run table */
1344  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1345  2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1346  2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1347  3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1348  1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1349  9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1350  23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1351  28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1352  49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1353  3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1354  1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1355  50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1356  45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1357  17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1358  7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1359  8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1360 
1361  /* value table */
1362  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1363  2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1364  -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1365  3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1366  7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1367  2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1368  1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1369  1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1370  1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1371  -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1372  -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1373  -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1374  1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1375  -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1376  -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1377  -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1378 },{
1379  /* MapTab3 */
1380  0, /* eob_sym */
1381  35, /* esc_sym */
1382  /* run table */
1383  {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1384  7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1385  3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1386  5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1387  21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1388  9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1389  2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1390  35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1391  12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1392  43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1393  57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1394  8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1395  59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1396  60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1397  25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1398  20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1399 
1400  /* value table */
1401  { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1402  -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1403  -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1404  2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1405  1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1406  2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1407  4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1408  -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1409  2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1410  1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1411  -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1412  -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1413  -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1414  1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1415  -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1416  -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1417 },{
1418  /* MapTab4 */
1419  0, /* eob_sym */
1420  34, /* esc_sym */
1421  /* run table */
1422  {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1423  2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1424  2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1425  9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1426  1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1427  2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1428  2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1429  3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1430  4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1431  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1432  1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1433  5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1434  1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1435  3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1436  1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1437  1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1438 
1439  /* value table */
1440  { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1441  2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1442  3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1443  1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1444  18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1445  -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1446  6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1447  4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1448  3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1449  -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1450  -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1451  -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1452  -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1453  6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1454  75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1455  83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1456 },{
1457  /* MapTab5 */
1458  2, /* eob_sym */
1459  33, /* esc_sym */
1460  /* run table */
1461  {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1462  1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1463  1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1464  12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1465  6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1466  8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1467  1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1468  4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1469  1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1470  2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1471  1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1472  3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1473  1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1474  36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1475  1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1476  40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1477 
1478  /* value table */
1479  { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1480  -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1481  -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1482  1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1483  2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1484  2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1485  15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1486  -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1487  -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1488  -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1489  22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1490  7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1491  26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1492  -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1493  30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1494  -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1495 },{
1496  /* MapTab6 */
1497  2, /* eob_sym */
1498  13, /* esc_sym */
1499  /* run table */
1500  {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1501  4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1502  3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1503  4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1504  1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1505  6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1506  15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1507  2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1508  17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1509  6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1510  4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1511  1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1512  1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1513  12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1514  4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1515  14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1516 
1517  /* value table */
1518  {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1519  1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1520  2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1521  2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1522  -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1523  2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1524  -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1525  -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1526  1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1527  -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1528  -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1529  -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1530  45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1531  -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1532  6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1533  2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1534 },{
1535  /* MapTab7 */
1536  2, /* eob_sym */
1537  38, /* esc_sym */
1538  /* run table */
1539  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1540  6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1541  1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1542  14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1543  8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1544  19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1545  24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1546  26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1547  28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1548  32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1549  6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1550  37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1551  3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1552  1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1553  8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1554  12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1555 
1556  /* value table */
1557  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1558  -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1559  -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1560  1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1561  2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1562  -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1563  -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1564  1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1565  -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1566  -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1567  -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1568  -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1569  -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1570  20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1571  5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1572  3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1573 },{
1574  /* MapTab8 */
1575  4, /* eob_sym */
1576  11, /* esc_sym */
1577  /* run table */
1578  {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1579  4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1580  7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1581  2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1582  4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1583  2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1584  1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1585  25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1586  1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1587  4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1588  6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1589  37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1590  13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1591  3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1592  44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1593  50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1594 
1595  /* value table */
1596  { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1597  1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1598  1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1599  5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1600  -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1601  7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1602  15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1603  1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1604  -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1605  -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1606  4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1607  1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1608  -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1609  8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1610  1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1611  1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1612 }
1613 };
static av_cold void ivi_init_static_vlc(void)
Definition: ivi.c:161
#define IVI_NUM_TILES(stride, tile_size)
calculate number of tiles in a stride
Definition: ivi.h:283
int is_empty
= 1 if this band doesn&#39;t contain any data
Definition: ivi.h:157
const uint8_t ff_ivi_direct_scan_4x4[16]
Definition: ivi.c:1253
uint8_t type
macroblock type: 0 - INTRA, 1 - INTER
Definition: ivi.h:114
int num_MBs
number of macroblocks in this tile
Definition: ivi.h:135
#define NULL
Definition: coverity.c:32
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static const IVIHuffDesc ivi_mb_huff_desc[8]
These are 2x8 predefined Huffman codebooks for coding macroblock/block signals.
Definition: ivi.c:49
static av_always_inline void mv_scale(Mv *dst, Mv *src, int td, int tb)
Definition: hevc_mvs.c:115
#define av_clip_uintp2
Definition: common.h:146
This structure describes decoded (raw) audio or video data.
Definition: frame.h:314
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
macroblock/block huffman table descriptor
Definition: ivi.h:63
int(* is_nonnull_frame)(struct IVI45DecContext *ctx)
Definition: ivi.h:262
InvTransformPtr * inv_transform
Definition: ivi.h:177
misc image utilities
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static int ivi_decode_coded_blocks(GetBitContext *gb, const IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg, int mv_x, int mv_y, int mv_x2, int mv_y2, int *prev_dc, int is_intra, int mc_type, int mc_type2, uint32_t quant, int offs, AVCodecContext *avctx)
Definition: ivi.c:483
empty frame with no data
Definition: ivi.h:46
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:106
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
Definition: ivi.c:203
#define IVI_MBs_PER_TILE(tile_width, tile_height, mb_size)
calculate number of macroblocks in a tile
Definition: ivi.h:286
#define avpriv_request_sample(...)
int8_t b_mv_y
second motion vector (y component)
Definition: ivi.h:120
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
Close Indeo5 decoder and clean up its context.
Definition: ivi.c:1210
#define IVI_VLC_BITS
max number of bits of the ivi&#39;s huffman codes
Definition: ivi.h:49
int num_tiles
number of tiles in this band
Definition: ivi.h:175
int dst_buf
buffer index for the currently decoded frame
Definition: ivi.h:233
int16_t * ref_buf
pointer to the reference frame buffer (for motion compensation)
Definition: ivi.h:153
int size
Definition: packet.h:364
uint8_t eob_sym
end of block symbol
Definition: ivi.h:98
int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: ivi.c:1066
int16_t * buf
pointer to the output buffer for this band
Definition: ivi.h:152
DSP functions (inverse transforms, motion compensations, wavelet recomposition) for Indeo Video Inter...
IVITile * tiles
array of tile descriptors
Definition: ivi.h:176
void(* ivi_mc_avg_func)(int16_t *buf, const int16_t *ref_buf1, const int16_t *ref_buf2, ptrdiff_t pitch, int mc_type, int mc_type2)
Definition: ivi.c:77
int is_halfpel
precision of the motion compensation: 0 - fullpel, 1 - halfpel
Definition: ivi.h:160
uint8_t chroma_bands
Definition: ivi.h:210
int(* decode_pic_hdr)(struct IVI45DecContext *ctx, AVCodecContext *avctx)
Definition: ivi.h:258
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:582
int plane
plane number this band belongs to
Definition: ivi.h:145
int mb_size
Definition: ivi.h:132
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
int bufsize
band buffer size in bytes
Definition: ivi.h:183
uint8_t run
Definition: svq3.c:205
static AVPacket pkt
IVIPicConfig pic_conf
Definition: ivi.h:229
#define blk(i)
Definition: sha.c:185
static const IVIHuffDesc ivi_blk_huff_desc[8]
static block huffman tables
Definition: ivi.c:61
static const struct @322 planes[]
uint16_t height
Definition: ivi.h:196
uint8_t has_b_frames
Definition: ivi.h:252
void(* switch_buffers)(struct IVI45DecContext *ctx)
Definition: ivi.h:261
int height
Definition: ivi.h:148
Macro definitions for various function/variable attributes.
void ff_ivi_mc_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
motion compensation without adding delta
RVMapDesc * rv_map
ptr to the RLE table for this band
Definition: ivi.h:174
uint8_t xbits[16]
Definition: ivi.h:57
int8_t b_mv_x
second motion vector (x component)
Definition: ivi.h:119
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
static double cb(void *priv, double x, double y)
Definition: vf_geq.c:215
uint8_t uses_tiling
Definition: ivi.h:254
uint8_t luma_bands
Definition: ivi.h:209
void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst, const ptrdiff_t dst_pitch)
5/3 wavelet recomposition filter for Indeo5
Definition: ivi_dsp.c:33
ptrdiff_t pitch
pitch associated with the buffers above
Definition: ivi.h:156
static int ivi_dec_tile_data_size(GetBitContext *gb)
Definition: ivi.c:457
VLC * tab
index of one of the predefined tables or "7" for custom one
Definition: ivi.h:66
uint8_t
#define av_cold
Definition: attributes.h:88
#define mb
const uint8_t * frame_data
input frame data pointer
Definition: ivi.h:222
const uint16_t * inter_base
quantization matrix for inter blocks
Definition: ivi.h:185
const uint8_t * data_ptr
ptr to the first byte of the band data
Definition: ivi.h:150
static void * prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
Definition: ivi.c:922
void ff_ivi_mc_avg_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, ptrdiff_t pitch, int mc_type, int mc_type2)
motion compensation without adding delta for B-frames
uint16_t pic_height
Definition: ivi.h:204
void ff_ivi_mc_4x4_delta(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
4x4 block motion compensation with adding delta
int inherit_mv
tells if motion vector is inherited from reference macroblock
Definition: ivi.h:161
static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile, int p, int b, int t_height, int t_width)
Definition: ivi.c:354
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
int16_t * bufs[4]
array of pointers to the band buffers
Definition: ivi.h:155
GetBitContext gb
Definition: ivi.h:214
#define av_clip
Definition: common.h:122
uint8_t * data
Definition: packet.h:363
const uint8_t ff_ivi_vertical_scan_8x8[64]
Scan patterns shared between indeo4 and indeo5.
Definition: ivi.c:1231
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
uint8_t cbp
coded block pattern
Definition: ivi.h:115
int qdelta_present
tells if Qdelta signal is present in the bitstream (Indeo5 only)
Definition: ivi.h:163
#define ff_dlog(a,...)
#define IVI5_IS_PROTECTED
Definition: ivi.h:50
bitstream reader API header.
static VLC_TYPE table_data[117592][2]
Definition: rv34.c:82
uint16_t pic_width
Definition: ivi.h:203
int gop_invalid
Definition: ivi.h:264
int(* decode_band_hdr)(struct IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Definition: ivi.h:259
#define AVOnce
Definition: thread.h:172
#define FFALIGN(x, a)
Definition: macros.h:48
IVIPlaneDesc planes[3]
color planes
Definition: ivi.h:230
#define av_log(a,...)
const uint16_t * intra_base
quantization matrix for intra blocks
Definition: ivi.h:184
int width
Definition: ivi.h:147
int got_p_frame
Definition: ivi.h:270
IVIHuffDesc cust_desc
pointer to the table associated with tab_sel
Definition: ivi.h:69
#define U(x)
Definition: vp56_arith.h:37
#define src
Definition: vp8dsp.c:255
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
int blk_size
block size
Definition: ivi.h:159
uint8_t runtab[256]
Definition: ivi.h:100
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
uint8_t corr[61 *2]
rvmap correction pairs
Definition: ivi.h:172
int32_t tab_sel
Definition: ivi.h:64
RVMapDesc rvmap_tabs[9]
local corrected copy of the static rvmap tables
Definition: ivi.h:215
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: vlc.h:38
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
int show_indeo4_info
Definition: ivi.h:251
int is_indeo4
Definition: ivi.h:267
unsigned int pos
Definition: spdifenc.c:410
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
Initialize tile and macroblock descriptors.
Definition: ivi.c:393
int ref_buf
inter frame reference buffer index
Definition: ivi.h:234
DCTransformPtr * dc_transform
Definition: ivi.h:179
This file contains structures and macros shared by both Indeo4 and Indeo5 decoders.
void ff_ivi_mc_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
4x4 block motion compensation without adding delta
uint8_t bits
Definition: vp3data.h:141
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:2239
static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi.c:594
int32_t num_rows
Definition: ivi.h:56
static int decode_band(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Decode an Indeo 4 or 5 band.
Definition: ivi.c:939
uint8_t esc_sym
escape symbol
Definition: ivi.h:99
static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
Definition: ivi.c:127
uint16_t width
Definition: ivi.h:195
void ff_ivi_mc_8x8_delta(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
8x8 block motion compensation with adding delta
Definition: vlc.h:26
static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs, int blk_size)
Definition: ivi.c:474
run-value (RLE) table descriptor
Definition: ivi.h:97
static VLC ivi_blk_vlc_tabs[8]
static block Huffman tables
Definition: ivi.c:73
int inherit_qdelta
tells if quantiser delta is inherited from reference macroblock
Definition: ivi.h:162
AVFrame * p_frame
Definition: ivi.h:269
uint8_t num_bands
number of bands this plane subdivided into
Definition: ivi.h:197
#define b
Definition: input.c:41
const uint8_t ff_ivi_horizontal_scan_8x8[64]
Definition: ivi.c:1242
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi.c:1261
#define FFMIN(a, b)
Definition: common.h:105
int is_scalable
Definition: ivi.h:221
#define FFSIGN(a)
Definition: common.h:73
uint8_t w
Definition: llviddspenc.c:39
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
IVIMbInfo * mbs
array of macroblock descriptors
Definition: ivi.h:136
int32_t
AVFormatContext * ctx
Definition: movenc.c:48
int16_t * b_ref_buf
pointer to the second reference frame buffer (for motion compensation)
Definition: ivi.h:154
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:446
void ff_ivi_mc_avg_8x8_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, ptrdiff_t pitch, int mc_type, int mc_type2)
8x8 block motion compensation with adding delta
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
const uint8_t * inter_scale
quantization coefficient for inter blocks
Definition: ivi.h:187
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, IVIHuffTab *huff_tab, AVCodecContext *avctx)
Decode a huffman codebook descriptor from the bitstream and select specified huffman table...
Definition: ivi.c:210
bidirectional frame
Definition: ivi.h:43
static volatile int checksum
Definition: adler32.c:30
static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
Definition: ivi.c:190
int8_t q_delta
quant delta
Definition: ivi.h:116
uint32_t frame_size
frame size in bytes
Definition: ivi.h:224
if(ret)
#define mc
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
int table_allocated
Definition: vlc.h:29
static VLC ivi_mb_vlc_tabs[8]
static macroblock Huffman tables
Definition: ivi.c:72
int ypos
Definition: ivi.h:129
IVIHuffTab mb_vlc
current macroblock table descriptor
Definition: ivi.h:238
int is_2d_trans
1 indicates that the two-dimensional inverse transform is used
Definition: ivi.h:180
#define AV_ONCE_INIT
Definition: thread.h:173
Libavcodec external API header.
int glob_quant
quant base for this band
Definition: ivi.h:165
enum AVCodecID codec_id
Definition: avcodec.h:541
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:345
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst, const ptrdiff_t dst_pitch)
Haar wavelet recomposition filter for Indeo 4.
Definition: ivi_dsp.c:190
int height
Definition: ivi.h:131
av_cold int ff_ivi_init_planes(AVCodecContext *avctx, IVIPlaneDesc *planes, const IVIPicConfig *cfg, int is_indeo4)
Initialize planes (prepares descriptors, allocates buffers etc).
Definition: ivi.c:289
main external API structure.
Definition: avcodec.h:531
int aheight
aligned band height
Definition: ivi.h:149
int is_empty
= 1 if this tile doesn&#39;t contain any data
Definition: ivi.h:133
static const float bands[]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1884
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:206
int8_t valtab[256]
Definition: ivi.h:101
int num_corr
number of correction entries
Definition: ivi.h:171
static int ivi_scale_mv(int mv, int mv_scale)
scale motion vector
Definition: ivi.h:293
information for Indeo tile
Definition: ivi.h:127
static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band, IVITile *tile, int32_t mv_scale)
Handle empty tiles by performing data copying and motion compensation respectively.
Definition: ivi.c:746
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:72
uint8_t gop_flags
Definition: ivi.h:248
uint8_t uses_haar
Definition: ivi.h:255
IVIBandDesc * bands
array of band descriptors
Definition: ivi.h:198
int32_t checksum
for debug purposes
Definition: ivi.h:181
int rvmap_sel
rvmap table selector
Definition: ivi.h:173
int8_t mv_x
motion vector (x component)
Definition: ivi.h:117
int8_t mv_y
motion vector (y component)
Definition: ivi.h:118
#define IVI_TOSIGNED(val)
convert unsigned values into signed ones (the sign is in the LSB)
Definition: ivi.h:290
int mb_size
macroblock size
Definition: ivi.h:158
static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
Definition: ivi.c:266
huffman codebook descriptor
Definition: ivi.h:55
IVIMbInfo * ref_mbs
ptr to the macroblock descriptors of the reference tile
Definition: ivi.h:137
int xpos
Definition: ivi.h:128
const uint8_t * quant
static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
Definition: ivi.c:897
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:553
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
void(* ivi_mc_func)(int16_t *buf, const int16_t *ref_buf, ptrdiff_t pitch, int mc_type)
Definition: ivi.c:75
IVIHuffTab blk_vlc
current block table descriptor
Definition: ivi.h:239
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:328
int16_t xpos
Definition: ivi.h:111
int band_num
band number
Definition: ivi.h:146
common internal api header.
int buf_invalid[4]
Definition: ivi.h:265
int transform_size
Definition: ivi.h:178
void ff_ivi_mc_avg_4x4_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, ptrdiff_t pitch, int mc_type, int mc_type2)
4x4 block motion compensation with adding delta
#define flag(name)
Definition: cbs_av1.c:553
#define INIT_VLC_USE_NEW_STATIC
Definition: vlc.h:95
VLC cust_tab
custom Huffman codebook descriptor
Definition: ivi.h:70
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
Definition: imgutils.c:288
const uint8_t * scan
ptr to the scan pattern
Definition: ivi.h:166
void * priv_data
Definition: avcodec.h:558
int width
Definition: ivi.h:130
#define av_clip_uint8
Definition: common.h:128
int len
int checksum_present
Definition: ivi.h:182
uint8_t has_transp
transparency mode status: 1 - enabled
Definition: ivi.h:253
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:175
VLC_TYPE(* table)[2]
code, bits
Definition: vlc.h:28
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:693
void ff_ivi_mc_avg_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, const int16_t *ref_buf2, ptrdiff_t pitch, int mc_type, int mc_type2)
4x4 block motion compensation without adding delta for B-frames
int(* decode_mb_info)(struct IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi.h:260
int16_t ypos
Definition: ivi.h:112
and forward the result(frame or status change) to the corresponding input.If nothing is possible
information for Indeo macroblock (16x16, 8x8 or 4x4)
Definition: ivi.h:110
IVIHuffTab blk_vlc
vlc table for decoding block data
Definition: ivi.h:169
#define av_freep(p)
av_cold void ff_ivi_init_static_vlc(void)
Initialize static codes used for macroblock and block decoding.
Definition: ivi.c:178
const uint8_t * intra_scale
quantization coefficient for intra blocks
Definition: ivi.h:186
color plane (luma or chroma) information
Definition: ivi.h:194
#define VLC_TYPE
Definition: vlc.h:24
uint8_t uses_fullpel
Definition: ivi.h:256
#define FFSWAP(type, a, b)
Definition: common.h:108
uint32_t buf_offs
address in the output buffer for this mb
Definition: ivi.h:113
int b_ref_buf
second reference frame buffer index
Definition: ivi.h:236
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
information for Indeo wavelet band
Definition: ivi.h:144
static double val(void *priv, double ch)
Definition: aeval.c:76
This structure stores compressed data.
Definition: packet.h:340
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:431
int i
Definition: input.c:407
int frame_type
Definition: ivi.h:218
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:190
int data_size
size of the data in bytes
Definition: ivi.h:134
#define INIT_VLC_OUTPUT_LE
Definition: vlc.h:93