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,
750  IVITile *tile, int32_t mv_scale)
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  av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
999  band->mb_size, tile->mb_size);
1000  return AVERROR_INVALIDDATA;
1001  }
1002  tile->is_empty = get_bits1(&ctx->gb);
1003  if (tile->is_empty) {
1004  result = ivi_process_empty_tile(avctx, band, tile,
1005  (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
1006  if (result < 0)
1007  break;
1008  ff_dlog(avctx, "Empty tile encountered!\n");
1009  } else {
1010  tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
1011  if (!tile->data_size) {
1012  av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
1014  break;
1015  }
1016 
1017  result = ctx->decode_mb_info(ctx, band, tile, avctx);
1018  if (result < 0)
1019  break;
1020 
1021  result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
1022  if (result < 0) {
1023  av_log(avctx, AV_LOG_ERROR,
1024  "Corrupted tile data encountered!\n");
1025  break;
1026  }
1027 
1028  if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
1029  av_log(avctx, AV_LOG_ERROR,
1030  "Tile data_size mismatch!\n");
1032  break;
1033  }
1034 
1035  pos += tile->data_size << 3; // skip to next tile
1036  }
1037  }
1038 
1039  /* restore the selected rvmap table by applying its corrections in
1040  * reverse order */
1041  for (i = band->num_corr-1; i >= 0; i--) {
1042  idx1 = band->corr[i*2];
1043  idx2 = band->corr[i*2+1];
1044  FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
1045  FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
1046  if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
1047  band->rv_map->eob_sym ^= idx1 ^ idx2;
1048  if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
1049  band->rv_map->esc_sym ^= idx1 ^ idx2;
1050  }
1051 
1052 #ifdef DEBUG
1053  if (band->checksum_present) {
1054  uint16_t chksum = ivi_calc_band_checksum(band);
1055  if (chksum != band->checksum) {
1056  av_log(avctx, AV_LOG_ERROR,
1057  "Band checksum mismatch! Plane %d, band %d, "
1058  "received: %"PRIx32", calculated: %"PRIx16"\n",
1059  band->plane, band->band_num, band->checksum, chksum);
1060  }
1061  }
1062 #endif
1063 
1064  align_get_bits(&ctx->gb);
1065 
1066  return result;
1067 }
1068 
1070  int *got_frame, AVPacket *avpkt)
1071 {
1072  IVI45DecContext *ctx = avctx->priv_data;
1073  const uint8_t *buf = avpkt->data;
1074  int buf_size = avpkt->size;
1075  int result, p, b;
1076 
1077  result = init_get_bits8(&ctx->gb, buf, buf_size);
1078  if (result < 0)
1079  return result;
1080  ctx->frame_data = buf;
1081  ctx->frame_size = buf_size;
1082 
1083  result = ctx->decode_pic_hdr(ctx, avctx);
1084  if (result) {
1085  av_log(avctx, AV_LOG_ERROR,
1086  "Error while decoding picture header: %d\n", result);
1087  return result;
1088  }
1089  if (ctx->gop_invalid)
1090  return AVERROR_INVALIDDATA;
1091 
1092  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_NULL_LAST) {
1093  if (ctx->got_p_frame) {
1094  av_frame_move_ref(frame, ctx->p_frame);
1095  *got_frame = 1;
1096  ctx->got_p_frame = 0;
1097  } else {
1098  *got_frame = 0;
1099  }
1100  return buf_size;
1101  }
1102 
1103  if (ctx->gop_flags & IVI5_IS_PROTECTED) {
1104  avpriv_report_missing_feature(avctx, "Password-protected clip");
1105  return AVERROR_PATCHWELCOME;
1106  }
1107 
1108  if (!ctx->planes[0].bands) {
1109  av_log(avctx, AV_LOG_ERROR, "Color planes not initialized yet\n");
1110  return AVERROR_INVALIDDATA;
1111  }
1112 
1113  ctx->switch_buffers(ctx);
1114 
1115  if (ctx->is_nonnull_frame(ctx)) {
1116  ctx->buf_invalid[ctx->dst_buf] = 1;
1117  for (p = 0; p < 3; p++) {
1118  for (b = 0; b < ctx->planes[p].num_bands; b++) {
1119  result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
1120  if (result < 0) {
1121  av_log(avctx, AV_LOG_ERROR,
1122  "Error while decoding band: %d, plane: %d\n", b, p);
1123  return result;
1124  }
1125  }
1126  }
1127  ctx->buf_invalid[ctx->dst_buf] = 0;
1128  } else {
1129  if (ctx->is_scalable)
1130  return AVERROR_INVALIDDATA;
1131 
1132  for (p = 0; p < 3; p++) {
1133  if (!ctx->planes[p].bands[0].buf)
1134  return AVERROR_INVALIDDATA;
1135  }
1136  }
1137  if (ctx->buf_invalid[ctx->dst_buf])
1138  return -1;
1139 
1140  if (!ctx->is_nonnull_frame(ctx))
1141  return buf_size;
1142 
1143  result = ff_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
1144  if (result < 0)
1145  return result;
1146 
1147  if ((result = ff_get_buffer(avctx, frame, 0)) < 0)
1148  return result;
1149 
1150  if (ctx->is_scalable) {
1151  if (ctx->is_indeo4)
1152  ff_ivi_recompose_haar(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1153  else
1154  ff_ivi_recompose53 (&ctx->planes[0], frame->data[0], frame->linesize[0]);
1155  } else {
1156  ivi_output_plane(&ctx->planes[0], frame->data[0], frame->linesize[0]);
1157  }
1158 
1159  ivi_output_plane(&ctx->planes[2], frame->data[1], frame->linesize[1]);
1160  ivi_output_plane(&ctx->planes[1], frame->data[2], frame->linesize[2]);
1161 
1162  *got_frame = 1;
1163 
1164  /* If the bidirectional mode is enabled, next I and the following P
1165  * frame will be sent together. Unfortunately the approach below seems
1166  * to be the only way to handle the B-frames mode.
1167  * That's exactly the same Intel decoders do.
1168  */
1169  if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_INTRA) {
1170  int left;
1171 
1172  // skip version string
1173  while (get_bits(&ctx->gb, 8)) {
1174  if (get_bits_left(&ctx->gb) < 8)
1175  return AVERROR_INVALIDDATA;
1176  }
1177  left = get_bits_count(&ctx->gb) & 0x18;
1178  skip_bits_long(&ctx->gb, 64 - left);
1179  if (get_bits_left(&ctx->gb) > 18 &&
1180  show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
1181  AVPacket pkt;
1182  pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
1183  pkt.size = get_bits_left(&ctx->gb) >> 3;
1184  ctx->got_p_frame = 0;
1185  av_frame_unref(ctx->p_frame);
1186  ff_ivi_decode_frame(avctx, ctx->p_frame, &ctx->got_p_frame, &pkt);
1187  }
1188  }
1189 
1190  if (ctx->show_indeo4_info) {
1191  if (ctx->is_scalable)
1192  av_log(avctx, AV_LOG_DEBUG, "This video uses scalability mode\n");
1193  if (ctx->uses_tiling)
1194  av_log(avctx, AV_LOG_DEBUG, "This video uses local decoding\n");
1195  if (ctx->has_b_frames)
1196  av_log(avctx, AV_LOG_DEBUG, "This video contains B-frames\n");
1197  if (ctx->has_transp)
1198  av_log(avctx, AV_LOG_DEBUG, "Transparency mode is enabled\n");
1199  if (ctx->uses_haar)
1200  av_log(avctx, AV_LOG_DEBUG, "This video uses Haar transform\n");
1201  if (ctx->uses_fullpel)
1202  av_log(avctx, AV_LOG_DEBUG, "This video uses fullpel motion vectors\n");
1203  ctx->show_indeo4_info = 0;
1204  }
1205 
1206  return buf_size;
1207 }
1208 
1209 /**
1210  * Close Indeo5 decoder and clean up its context.
1211  */
1213 {
1214  IVI45DecContext *ctx = avctx->priv_data;
1215 
1216  ivi_free_buffers(&ctx->planes[0]);
1217 
1218  if (ctx->mb_vlc.cust_tab.table)
1219  ff_vlc_free(&ctx->mb_vlc.cust_tab);
1220 
1221  if (ctx->blk_vlc.cust_tab.table)
1222  ff_vlc_free(&ctx->blk_vlc.cust_tab);
1223 
1224  av_frame_free(&ctx->p_frame);
1225 
1226  return 0;
1227 }
1228 
1229 
1230 /**
1231  * Scan patterns shared between indeo4 and indeo5
1232  */
1233 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
1234  0, 8, 16, 24, 32, 40, 48, 56,
1235  1, 9, 17, 25, 33, 41, 49, 57,
1236  2, 10, 18, 26, 34, 42, 50, 58,
1237  3, 11, 19, 27, 35, 43, 51, 59,
1238  4, 12, 20, 28, 36, 44, 52, 60,
1239  5, 13, 21, 29, 37, 45, 53, 61,
1240  6, 14, 22, 30, 38, 46, 54, 62,
1241  7, 15, 23, 31, 39, 47, 55, 63
1242 };
1243 
1244 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
1245  0, 1, 2, 3, 4, 5, 6, 7,
1246  8, 9, 10, 11, 12, 13, 14, 15,
1247  16, 17, 18, 19, 20, 21, 22, 23,
1248  24, 25, 26, 27, 28, 29, 30, 31,
1249  32, 33, 34, 35, 36, 37, 38, 39,
1250  40, 41, 42, 43, 44, 45, 46, 47,
1251  48, 49, 50, 51, 52, 53, 54, 55,
1252  56, 57, 58, 59, 60, 61, 62, 63
1253 };
1254 
1255 const uint8_t ff_ivi_direct_scan_4x4[16] = {
1256  0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
1257 };
1258 
1259 
1260 /**
1261  * Run-value (RLE) tables.
1262  */
1264 { /* MapTab0 */
1265  5, /* eob_sym */
1266  2, /* esc_sym */
1267  /* run table */
1268  {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
1269  1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
1270  1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
1271  8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
1272  9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
1273  2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
1274  8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
1275  2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
1276  1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
1277  6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
1278  22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
1279  4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
1280  1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
1281  1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
1282  6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
1283  30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
1284 
1285  /* value table */
1286  { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
1287  6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
1288  10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
1289  1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
1290  -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
1291  7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1292  2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1293  9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1294  28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1295  3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1296  -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1297  5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1298  -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1299  37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1300  5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1301  -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
1302 },{
1303  /* MapTab1 */
1304  0, /* eob_sym */
1305  38, /* esc_sym */
1306  /* run table */
1307  {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1308  7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1309  14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1310  25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1311  33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1312  37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1313  40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1314  57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1315  52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1316  60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1317  12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1318  1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1319  21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1320  29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1321  28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1322  2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
1323 
1324  /* value table */
1325  {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1326  -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1327  -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1328  1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1329  1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1330  1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1331  -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1332  -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1333  1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1334  1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1335  2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1336  6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1337  2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1338  2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1339  -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1340  -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
1341 },{
1342  /* MapTab2 */
1343  2, /* eob_sym */
1344  11, /* esc_sym */
1345  /* run table */
1346  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1347  2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1348  2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1349  3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1350  1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1351  9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1352  23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1353  28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1354  49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1355  3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1356  1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1357  50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1358  45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1359  17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1360  7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1361  8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
1362 
1363  /* value table */
1364  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1365  2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1366  -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1367  3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1368  7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1369  2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1370  1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1371  1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1372  1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1373  -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1374  -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1375  -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1376  1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1377  -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1378  -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1379  -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
1380 },{
1381  /* MapTab3 */
1382  0, /* eob_sym */
1383  35, /* esc_sym */
1384  /* run table */
1385  {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1386  7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1387  3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1388  5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1389  21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1390  9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1391  2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1392  35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1393  12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1394  43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1395  57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1396  8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1397  59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1398  60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1399  25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1400  20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
1401 
1402  /* value table */
1403  { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1404  -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1405  -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1406  2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1407  1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1408  2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1409  4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1410  -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1411  2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1412  1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1413  -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1414  -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1415  -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1416  1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1417  -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1418  -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
1419 },{
1420  /* MapTab4 */
1421  0, /* eob_sym */
1422  34, /* esc_sym */
1423  /* run table */
1424  {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1425  2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1426  2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1427  9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1428  1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1429  2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1430  2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1431  3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1432  4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1433  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1434  1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1435  5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1436  1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1437  3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1438  1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1439  1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
1440 
1441  /* value table */
1442  { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1443  2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1444  3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1445  1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1446  18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1447  -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1448  6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1449  4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1450  3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1451  -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1452  -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1453  -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1454  -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1455  6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1456  75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1457  83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
1458 },{
1459  /* MapTab5 */
1460  2, /* eob_sym */
1461  33, /* esc_sym */
1462  /* run table */
1463  {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1464  1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1465  1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1466  12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1467  6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1468  8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1469  1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1470  4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1471  1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1472  2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1473  1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1474  3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1475  1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1476  36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1477  1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1478  40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
1479 
1480  /* value table */
1481  { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1482  -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1483  -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1484  1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1485  2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1486  2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1487  15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1488  -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1489  -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1490  -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1491  22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1492  7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1493  26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1494  -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1495  30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1496  -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
1497 },{
1498  /* MapTab6 */
1499  2, /* eob_sym */
1500  13, /* esc_sym */
1501  /* run table */
1502  {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1503  4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1504  3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1505  4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1506  1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1507  6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1508  15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1509  2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1510  17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1511  6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1512  4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1513  1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1514  1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1515  12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1516  4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1517  14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
1518 
1519  /* value table */
1520  {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1521  1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1522  2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1523  2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1524  -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1525  2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1526  -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1527  -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1528  1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1529  -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1530  -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1531  -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1532  45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1533  -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1534  6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1535  2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
1536 },{
1537  /* MapTab7 */
1538  2, /* eob_sym */
1539  38, /* esc_sym */
1540  /* run table */
1541  {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1542  6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1543  1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1544  14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1545  8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1546  19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1547  24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1548  26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1549  28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1550  32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1551  6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1552  37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1553  3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1554  1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1555  8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1556  12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
1557 
1558  /* value table */
1559  { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1560  -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1561  -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1562  1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1563  2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1564  -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1565  -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1566  1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1567  -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1568  -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1569  -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1570  -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1571  -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1572  20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1573  5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1574  3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
1575 },{
1576  /* MapTab8 */
1577  4, /* eob_sym */
1578  11, /* esc_sym */
1579  /* run table */
1580  {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1581  4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1582  7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1583  2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1584  4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1585  2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1586  1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1587  25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1588  1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1589  4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1590  6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1591  37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1592  13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1593  3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1594  44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1595  50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
1596 
1597  /* value table */
1598  { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1599  1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1600  1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1601  5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1602  -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1603  7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1604  15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1605  1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1606  -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1607  -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1608  4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1609  1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1610  -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1611  8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1612  1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1613  1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
1614 }
1615 };
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:278
RVMapDesc::runtab
uint8_t runtab[256]
Definition: ivi.h:99
IVITile::height
int height
Definition: ivi.h:130
av_clip
#define av_clip
Definition: common.h:99
RVMapDesc::valtab
int8_t valtab[256]
Definition: ivi.h:100
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
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:242
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:123
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:266
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:160
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:374
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:524
b
#define b
Definition: input.c:41
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:94
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
IVITile::is_empty
int is_empty
= 1 if this tile doesn't contain any data
Definition: ivi.h:132
ivi.h
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
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
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:74
ff_ivi_decode_close
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
Close Indeo5 decoder and clean up its context.
Definition: ivi.c:1212
GetBitContext
Definition: get_bits.h:108
IVI5_IS_PROTECTED
#define IVI5_IS_PROTECTED
Definition: ivi.h:50
val
static double val(void *priv, double ch)
Definition: aeval.c:78
IVIHuffTab
macroblock/block huffman table descriptor
Definition: ivi.h:63
IVITile::width
int width
Definition: ivi.h:129
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:180
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:545
IVI_VLC_BITS
#define IVI_VLC_BITS
max number of bits of the ivi's huffman codes
Definition: ivi.h:49
IVITile::ypos
int ypos
Definition: ivi.h:128
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:40
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:62
IVIPicConfig
Definition: ivi.h:201
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
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:1934
blk
#define blk(i)
Definition: sha.c:186
IVITile::data_size
int data_size
size of the data in bytes
Definition: ivi.h:133
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:57
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:455
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:204
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:388
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:652
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
mv_scale
static av_always_inline void mv_scale(Mv *dst, const Mv *src, int td, int tb)
Definition: hevc_mvs.c:116
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:1233
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
VLC::table_allocated
int table_allocated
Definition: vlc.h:39
ff_ivi_horizontal_scan_8x8
const uint8_t ff_ivi_horizontal_scan_8x8[64]
Definition: ivi.c:1244
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1556
ff_ivi_rvmap_tabs
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi.c:1263
AVPacket::size
int size
Definition: packet.h:525
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
IVI4_FRAMETYPE_INTRA
@ IVI4_FRAMETYPE_INTRA
Definition: ivi.h:40
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
flag
#define flag(name)
Definition: cbs_av1.c:466
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
planes
static const struct @415 planes[]
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:371
IVITile::mb_size
int mb_size
Definition: ivi.h:131
ivi_output_plane
static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, ptrdiff_t dst_pitch)
Definition: ivi.c:900
IVITile::ref_mbs
IVIMbInfo * ref_mbs
ptr to the macroblock descriptors of the reference tile
Definition: ivi.h:136
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:633
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:606
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:264
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
ff_ivi_direct_scan_4x4
const uint8_t ff_ivi_direct_scan_4x4[16]
Definition: ivi.c:1255
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:561
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
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
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:1069
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:445
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:36
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:38
av_clip_uint8
#define av_clip_uint8
Definition: common.h:105
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
IVI4_FRAMETYPE_NULL_LAST
@ IVI4_FRAMETYPE_NULL_LAST
empty frame with no data
Definition: ivi.h:46
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:36
VLC_INIT_OUTPUT_LE
#define VLC_INIT_OUTPUT_LE
Definition: vlc.h:188
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:472
AVPacket
This structure stores compressed data.
Definition: packet.h:501
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
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
IVITile::xpos
int xpos
Definition: ivi.h:127
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:182
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
IVI4_FRAMETYPE_BIDIR
@ IVI4_FRAMETYPE_BIDIR
bidirectional frame
Definition: ivi.h:43
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