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