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