indeo4.c
Go to the documentation of this file.
1 /*
2  * Indeo Video Interactive v4 compatible decoder
3  * Copyright (c) 2009-2011 Maxim Poliakovski
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Indeo Video Interactive version 4 decoder
25  *
26  * Indeo 4 data is usually transported within .avi or .mov files.
27  * Known FOURCCs: 'IV41'
28  */
29 
30 #define BITSTREAM_READER_LE
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "ivi_dsp.h"
34 #include "ivi_common.h"
35 #include "indeo4data.h"
36 
37 /**
38  * Indeo 4 frame types.
39  */
40 enum {
42  FRAMETYPE_INTRA1 = 1, ///< intra frame with slightly different bitstream coding
43  FRAMETYPE_INTER = 2, ///< non-droppable P-frame
44  FRAMETYPE_BIDIR = 3, ///< bidirectional frame
45  FRAMETYPE_INTER_NOREF = 4, ///< droppable P-frame
46  FRAMETYPE_NULL_FIRST = 5, ///< empty frame with no data
47  FRAMETYPE_NULL_LAST = 6 ///< empty frame with no data
48 };
49 
50 #define IVI4_PIC_SIZE_ESC 7
51 
52 
53 static const struct {
57 } transforms[18] = {
59  { NULL, NULL, 0 }, /* inverse Haar 8x1 */
60  { NULL, NULL, 0 }, /* inverse Haar 1x8 */
65  { NULL, NULL, 0 }, /* inverse DCT 8x8 */
66  { NULL, NULL, 0 }, /* inverse DCT 8x1 */
67  { NULL, NULL, 0 }, /* inverse DCT 1x8 */
68  { NULL, NULL, 0 }, /* inverse Haar 4x4 */
70  { NULL, NULL, 0 }, /* no transform 4x4 */
71  { NULL, NULL, 0 }, /* inverse Haar 1x4 */
72  { NULL, NULL, 0 }, /* inverse Haar 4x1 */
73  { NULL, NULL, 0 }, /* inverse slant 1x4 */
74  { NULL, NULL, 0 }, /* inverse slant 4x1 */
75  { NULL, NULL, 0 }, /* inverse DCT 4x4 */
76 };
77 
78 /**
79  * Decode subdivision of a plane.
80  * This is a simplified version that checks for two supported subdivisions:
81  * - 1 wavelet band per plane, size factor 1:1, code pattern: 3
82  * - 4 wavelet bands per plane, size factor 1:4, code pattern: 2,3,3,3,3
83  * Anything else is either unsupported or corrupt.
84  *
85  * @param[in,out] gb the GetBit context
86  * @return number of wavelet bands or 0 on error
87  */
89 {
90  int i;
91 
92  switch (get_bits(gb, 2)) {
93  case 3:
94  return 1;
95  case 2:
96  for (i = 0; i < 4; i++)
97  if (get_bits(gb, 2) != 3)
98  return 0;
99  return 4;
100  default:
101  return 0;
102  }
103 }
104 
105 static inline int scale_tile_size(int def_size, int size_factor)
106 {
107  return size_factor == 15 ? def_size : (size_factor + 1) << 5;
108 }
109 
110 /**
111  * Decode Indeo 4 picture header.
112  *
113  * @param[in,out] ctx pointer to the decoder context
114  * @param[in] avctx pointer to the AVCodecContext
115  * @return result code: 0 = OK, negative number = error
116  */
118 {
119  int pic_size_indx, i, p;
120  IVIPicConfig pic_conf;
121 
122  if (get_bits(&ctx->gb, 18) != 0x3FFF8) {
123  av_log(avctx, AV_LOG_ERROR, "Invalid picture start code!\n");
124  return AVERROR_INVALIDDATA;
125  }
126 
127  ctx->prev_frame_type = ctx->frame_type;
128  ctx->frame_type = get_bits(&ctx->gb, 3);
129  if (ctx->frame_type == 7) {
130  av_log(avctx, AV_LOG_ERROR, "Invalid frame type: %d\n", ctx->frame_type);
131  return AVERROR_INVALIDDATA;
132  }
133 
134 #if IVI4_STREAM_ANALYSER
135  if (ctx->frame_type == FRAMETYPE_BIDIR)
136  ctx->has_b_frames = 1;
137 #endif
138 
139  ctx->transp_status = get_bits1(&ctx->gb);
140 #if IVI4_STREAM_ANALYSER
141  if (ctx->transp_status) {
142  ctx->has_transp = 1;
143  }
144 #endif
145 
146  /* unknown bit: Mac decoder ignores this bit, XANIM returns error */
147  if (get_bits1(&ctx->gb)) {
148  av_log(avctx, AV_LOG_ERROR, "Sync bit is set!\n");
149  return AVERROR_INVALIDDATA;
150  }
151 
152  ctx->data_size = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 24) : 0;
153 
154  /* null frames don't contain anything else so we just return */
155  if (ctx->frame_type >= FRAMETYPE_NULL_FIRST) {
156  av_dlog(avctx, "Null frame encountered!\n");
157  return 0;
158  }
159 
160  /* Check key lock status. If enabled - ignore lock word. */
161  /* Usually we have to prompt the user for the password, but */
162  /* we don't do that because Indeo 4 videos can be decoded anyway */
163  if (get_bits1(&ctx->gb)) {
164  skip_bits_long(&ctx->gb, 32);
165  av_dlog(avctx, "Password-protected clip!\n");
166  }
167 
168  pic_size_indx = get_bits(&ctx->gb, 3);
169  if (pic_size_indx == IVI4_PIC_SIZE_ESC) {
170  pic_conf.pic_height = get_bits(&ctx->gb, 16);
171  pic_conf.pic_width = get_bits(&ctx->gb, 16);
172  } else {
173  pic_conf.pic_height = ivi4_common_pic_sizes[pic_size_indx * 2 + 1];
174  pic_conf.pic_width = ivi4_common_pic_sizes[pic_size_indx * 2 ];
175  }
176 
177  /* Decode tile dimensions. */
178  if (get_bits1(&ctx->gb)) {
179  pic_conf.tile_height = scale_tile_size(pic_conf.pic_height, get_bits(&ctx->gb, 4));
180  pic_conf.tile_width = scale_tile_size(pic_conf.pic_width, get_bits(&ctx->gb, 4));
181 #if IVI4_STREAM_ANALYSER
182  ctx->uses_tiling = 1;
183 #endif
184  } else {
185  pic_conf.tile_height = pic_conf.pic_height;
186  pic_conf.tile_width = pic_conf.pic_width;
187  }
188 
189  /* Decode chroma subsampling. We support only 4:4 aka YVU9. */
190  if (get_bits(&ctx->gb, 2)) {
191  av_log(avctx, AV_LOG_ERROR, "Only YVU9 picture format is supported!\n");
192  return AVERROR_INVALIDDATA;
193  }
194  pic_conf.chroma_height = (pic_conf.pic_height + 3) >> 2;
195  pic_conf.chroma_width = (pic_conf.pic_width + 3) >> 2;
196 
197  /* decode subdivision of the planes */
198  pic_conf.luma_bands = decode_plane_subdivision(&ctx->gb);
199  pic_conf.chroma_bands = 0;
200  if (pic_conf.luma_bands)
201  pic_conf.chroma_bands = decode_plane_subdivision(&ctx->gb);
202  ctx->is_scalable = pic_conf.luma_bands != 1 || pic_conf.chroma_bands != 1;
203  if (ctx->is_scalable && (pic_conf.luma_bands != 4 || pic_conf.chroma_bands != 1)) {
204  av_log(avctx, AV_LOG_ERROR, "Scalability: unsupported subdivision! Luma bands: %d, chroma bands: %d\n",
205  pic_conf.luma_bands, pic_conf.chroma_bands);
206  return AVERROR_INVALIDDATA;
207  }
208 
209  /* check if picture layout was changed and reallocate buffers */
210  if (ivi_pic_config_cmp(&pic_conf, &ctx->pic_conf)) {
211  if (ff_ivi_init_planes(ctx->planes, &pic_conf)) {
212  av_log(avctx, AV_LOG_ERROR, "Couldn't reallocate color planes!\n");
213  return AVERROR(ENOMEM);
214  }
215 
216  ctx->pic_conf = pic_conf;
217 
218  /* set default macroblock/block dimensions */
219  for (p = 0; p <= 2; p++) {
220  for (i = 0; i < (!p ? pic_conf.luma_bands : pic_conf.chroma_bands); i++) {
221  ctx->planes[p].bands[i].mb_size = !p ? (!ctx->is_scalable ? 16 : 8) : 4;
222  ctx->planes[p].bands[i].blk_size = !p ? 8 : 4;
223  }
224  }
225 
227  ctx->pic_conf.tile_height)) {
228  av_log(avctx, AV_LOG_ERROR,
229  "Couldn't reallocate internal structures!\n");
230  return AVERROR(ENOMEM);
231  }
232  }
233 
234  ctx->frame_num = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 20) : 0;
235 
236  /* skip decTimeEst field if present */
237  if (get_bits1(&ctx->gb))
238  skip_bits(&ctx->gb, 8);
239 
240  /* decode macroblock and block huffman codebooks */
241  if (ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_MB_HUFF, &ctx->mb_vlc, avctx) ||
242  ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_BLK_HUFF, &ctx->blk_vlc, avctx))
243  return AVERROR_INVALIDDATA;
244 
245  ctx->rvmap_sel = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 8;
246 
247  ctx->in_imf = get_bits1(&ctx->gb);
248  ctx->in_q = get_bits1(&ctx->gb);
249 
250  ctx->pic_glob_quant = get_bits(&ctx->gb, 5);
251 
252  /* TODO: ignore this parameter if unused */
253  ctx->unknown1 = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 0;
254 
255  ctx->checksum = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 16) : 0;
256 
257  /* skip picture header extension if any */
258  while (get_bits1(&ctx->gb)) {
259  av_dlog(avctx, "Pic hdr extension encountered!\n");
260  skip_bits(&ctx->gb, 8);
261  }
262 
263  if (get_bits1(&ctx->gb)) {
264  av_log(avctx, AV_LOG_ERROR, "Bad blocks bits encountered!\n");
265  }
266 
267  align_get_bits(&ctx->gb);
268 
269  return 0;
270 }
271 
272 
273 /**
274  * Decode Indeo 4 band header.
275  *
276  * @param[in,out] ctx pointer to the decoder context
277  * @param[in,out] band pointer to the band descriptor
278  * @param[in] avctx pointer to the AVCodecContext
279  * @return result code: 0 = OK, negative number = error
280  */
282  AVCodecContext *avctx)
283 {
284  int plane, band_num, indx, transform_id, scan_indx;
285  int i;
286  int quant_mat;
287 
288  plane = get_bits(&ctx->gb, 2);
289  band_num = get_bits(&ctx->gb, 4);
290  if (band->plane != plane || band->band_num != band_num) {
291  av_log(avctx, AV_LOG_ERROR, "Invalid band header sequence!\n");
292  return AVERROR_INVALIDDATA;
293  }
294 
295  band->is_empty = get_bits1(&ctx->gb);
296  if (!band->is_empty) {
297  /* skip header size
298  * If header size is not given, header size is 4 bytes. */
299  if (get_bits1(&ctx->gb))
300  skip_bits(&ctx->gb, 16);
301 
302  band->is_halfpel = get_bits(&ctx->gb, 2);
303  if (band->is_halfpel >= 2) {
304  av_log(avctx, AV_LOG_ERROR, "Invalid/unsupported mv resolution: %d!\n",
305  band->is_halfpel);
306  return AVERROR_INVALIDDATA;
307  }
308 #if IVI4_STREAM_ANALYSER
309  if (!band->is_halfpel)
310  ctx->uses_fullpel = 1;
311 #endif
312 
313  band->checksum_present = get_bits1(&ctx->gb);
314  if (band->checksum_present)
315  band->checksum = get_bits(&ctx->gb, 16);
316 
317  indx = get_bits(&ctx->gb, 2);
318  if (indx == 3) {
319  av_log(avctx, AV_LOG_ERROR, "Invalid block size!\n");
320  return AVERROR_INVALIDDATA;
321  }
322  band->mb_size = 16 >> indx;
323  band->blk_size = 8 >> (indx >> 1);
324 
325  band->inherit_mv = get_bits1(&ctx->gb);
326  band->inherit_qdelta = get_bits1(&ctx->gb);
327 
328  band->glob_quant = get_bits(&ctx->gb, 5);
329 
330  if (!get_bits1(&ctx->gb) || ctx->frame_type == FRAMETYPE_INTRA) {
331  transform_id = get_bits(&ctx->gb, 5);
332  if (transform_id >= FF_ARRAY_ELEMS(transforms) ||
333  !transforms[transform_id].inv_trans) {
334  avpriv_request_sample(avctx, "Transform %d", transform_id);
335  return AVERROR_PATCHWELCOME;
336  }
337  if ((transform_id >= 7 && transform_id <= 9) ||
338  transform_id == 17) {
339  avpriv_request_sample(avctx, "DCT transform");
340  return AVERROR_PATCHWELCOME;
341  }
342 
343  if (transform_id < 10 && band->blk_size < 8) {
344  av_log(avctx, AV_LOG_ERROR, "wrong transform size!\n");
345  return AVERROR_INVALIDDATA;
346  }
347 #if IVI4_STREAM_ANALYSER
348  if ((transform_id >= 0 && transform_id <= 2) || transform_id == 10)
349  ctx->uses_haar = 1;
350 #endif
351 
352  band->inv_transform = transforms[transform_id].inv_trans;
353  band->dc_transform = transforms[transform_id].dc_trans;
354  band->is_2d_trans = transforms[transform_id].is_2d_trans;
355  band->transform_size= (transform_id < 10) ? 8 : 4;
356 
357  scan_indx = get_bits(&ctx->gb, 4);
358  if ((scan_indx>4 && scan_indx<10) != (band->blk_size==4)) {
359  av_log(avctx, AV_LOG_ERROR, "mismatching scan table!\n");
360  return AVERROR_INVALIDDATA;
361  }
362  if (scan_indx == 15) {
363  av_log(avctx, AV_LOG_ERROR, "Custom scan pattern encountered!\n");
364  return AVERROR_INVALIDDATA;
365  }
366  band->scan = scan_index_to_tab[scan_indx];
367  band->scan_size = band->blk_size;
368 
369  quant_mat = get_bits(&ctx->gb, 5);
370  if (quant_mat == 31) {
371  av_log(avctx, AV_LOG_ERROR, "Custom quant matrix encountered!\n");
372  return AVERROR_INVALIDDATA;
373  }
374  if (quant_mat > 21) {
375  av_log(avctx, AV_LOG_ERROR, "Invalid quant matrix encountered!\n");
376  return AVERROR_INVALIDDATA;
377  }
378  band->quant_mat = quant_mat;
379  }
380  if (quant_index_to_tab[band->quant_mat] > 4 && band->blk_size == 4) {
381  av_log(avctx, AV_LOG_ERROR, "Invalid quant matrix for 4x4 block encountered!\n");
382  band->quant_mat = 0;
383  return AVERROR_INVALIDDATA;
384  }
385  if (band->scan_size != band->blk_size) {
386  av_log(avctx, AV_LOG_ERROR, "mismatching scan table!\n");
387  return AVERROR_INVALIDDATA;
388  }
389  if (band->transform_size == 8 && band->blk_size < 8) {
390  av_log(avctx, AV_LOG_ERROR, "mismatching transform_size!\n");
391  return AVERROR_INVALIDDATA;
392  }
393 
394  /* decode block huffman codebook */
395  if (ff_ivi_dec_huff_desc(&ctx->gb, get_bits1(&ctx->gb), IVI_BLK_HUFF,
396  &band->blk_vlc, avctx))
397  return AVERROR_INVALIDDATA;
398 
399  /* select appropriate rvmap table for this band */
400  band->rvmap_sel = get_bits1(&ctx->gb) ? get_bits(&ctx->gb, 3) : 8;
401 
402  /* decode rvmap probability corrections if any */
403  band->num_corr = 0; /* there is no corrections */
404  if (get_bits1(&ctx->gb)) {
405  band->num_corr = get_bits(&ctx->gb, 8); /* get number of correction pairs */
406  if (band->num_corr > 61) {
407  av_log(avctx, AV_LOG_ERROR, "Too many corrections: %d\n",
408  band->num_corr);
409  return AVERROR_INVALIDDATA;
410  }
411 
412  /* read correction pairs */
413  for (i = 0; i < band->num_corr * 2; i++)
414  band->corr[i] = get_bits(&ctx->gb, 8);
415  }
416  }
417 
418  if (band->blk_size == 8) {
420  band->inter_base = &ivi4_quant_8x8_inter[quant_index_to_tab[band->quant_mat]][0];
421  } else {
423  band->inter_base = &ivi4_quant_4x4_inter[quant_index_to_tab[band->quant_mat]][0];
424  }
425 
426  /* Indeo 4 doesn't use scale tables */
427  band->intra_scale = NULL;
428  band->inter_scale = NULL;
429 
430  align_get_bits(&ctx->gb);
431 
432  if (!band->scan) {
433  av_log(avctx, AV_LOG_ERROR, "band->scan not set\n");
434  return AVERROR_INVALIDDATA;
435  }
436 
437  return 0;
438 }
439 
440 
441 /**
442  * Decode information (block type, cbp, quant delta, motion vector)
443  * for all macroblocks in the current tile.
444  *
445  * @param[in,out] ctx pointer to the decoder context
446  * @param[in,out] band pointer to the band descriptor
447  * @param[in,out] tile pointer to the tile descriptor
448  * @param[in] avctx pointer to the AVCodecContext
449  * @return result code: 0 = OK, negative number = error
450  */
452  IVITile *tile, AVCodecContext *avctx)
453 {
454  int x, y, mv_x, mv_y, mv_delta, offs, mb_offset, blks_per_mb,
455  mv_scale, mb_type_bits, s;
456  IVIMbInfo *mb, *ref_mb;
457  int row_offset = band->mb_size * band->pitch;
458 
459  mb = tile->mbs;
460  ref_mb = tile->ref_mbs;
461  offs = tile->ypos * band->pitch + tile->xpos;
462 
463  blks_per_mb = band->mb_size != band->blk_size ? 4 : 1;
464  mb_type_bits = ctx->frame_type == FRAMETYPE_BIDIR ? 2 : 1;
465 
466  /* scale factor for motion vectors */
467  mv_scale = (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3);
468  mv_x = mv_y = 0;
469 
470  if (((tile->width + band->mb_size-1)/band->mb_size) * ((tile->height + band->mb_size-1)/band->mb_size) != tile->num_MBs) {
471  av_log(avctx, AV_LOG_ERROR, "num_MBs mismatch %d %d %d %d\n", tile->width, tile->height, band->mb_size, tile->num_MBs);
472  return -1;
473  }
474 
475  for (y = tile->ypos; y < tile->ypos + tile->height; y += band->mb_size) {
476  mb_offset = offs;
477 
478  for (x = tile->xpos; x < tile->xpos + tile->width; x += band->mb_size) {
479  mb->xpos = x;
480  mb->ypos = y;
481  mb->buf_offs = mb_offset;
482 
483  if (get_bits1(&ctx->gb)) {
484  if (ctx->frame_type == FRAMETYPE_INTRA) {
485  av_log(avctx, AV_LOG_ERROR, "Empty macroblock in an INTRA picture!\n");
486  return AVERROR_INVALIDDATA;
487  }
488  mb->type = 1; /* empty macroblocks are always INTER */
489  mb->cbp = 0; /* all blocks are empty */
490 
491  mb->q_delta = 0;
492  if (!band->plane && !band->band_num && ctx->in_q) {
493  mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
494  IVI_VLC_BITS, 1);
495  mb->q_delta = IVI_TOSIGNED(mb->q_delta);
496  }
497 
498  mb->mv_x = mb->mv_y = 0; /* no motion vector coded */
499  if (band->inherit_mv && ref_mb) {
500  /* motion vector inheritance */
501  if (mv_scale) {
502  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
503  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
504  } else {
505  mb->mv_x = ref_mb->mv_x;
506  mb->mv_y = ref_mb->mv_y;
507  }
508  }
509  } else {
510  if (band->inherit_mv && ref_mb) {
511  mb->type = ref_mb->type; /* copy mb_type from corresponding reference mb */
512  } else if (ctx->frame_type == FRAMETYPE_INTRA ||
513  ctx->frame_type == FRAMETYPE_INTRA1) {
514  mb->type = 0; /* mb_type is always INTRA for intra-frames */
515  } else {
516  mb->type = get_bits(&ctx->gb, mb_type_bits);
517  }
518 
519  mb->cbp = get_bits(&ctx->gb, blks_per_mb);
520 
521  mb->q_delta = 0;
522  if (band->inherit_qdelta) {
523  if (ref_mb) mb->q_delta = ref_mb->q_delta;
524  } else if (mb->cbp || (!band->plane && !band->band_num &&
525  ctx->in_q)) {
526  mb->q_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
527  IVI_VLC_BITS, 1);
528  mb->q_delta = IVI_TOSIGNED(mb->q_delta);
529  }
530 
531  if (!mb->type) {
532  mb->mv_x = mb->mv_y = 0; /* there is no motion vector in intra-macroblocks */
533  } else {
534  if (band->inherit_mv && ref_mb) {
535  /* motion vector inheritance */
536  if (mv_scale) {
537  mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
538  mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
539  } else {
540  mb->mv_x = ref_mb->mv_x;
541  mb->mv_y = ref_mb->mv_y;
542  }
543  } else {
544  /* decode motion vector deltas */
545  mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
546  IVI_VLC_BITS, 1);
547  mv_y += IVI_TOSIGNED(mv_delta);
548  mv_delta = get_vlc2(&ctx->gb, ctx->mb_vlc.tab->table,
549  IVI_VLC_BITS, 1);
550  mv_x += IVI_TOSIGNED(mv_delta);
551  mb->mv_x = mv_x;
552  mb->mv_y = mv_y;
553  }
554  }
555  }
556 
557  s= band->is_halfpel;
558  if (mb->type)
559  if ( x + (mb->mv_x >>s) + (y+ (mb->mv_y >>s))*band->pitch < 0 ||
560  x + ((mb->mv_x+s)>>s) + band->mb_size - 1
561  + (y+band->mb_size - 1 +((mb->mv_y+s)>>s))*band->pitch > band->bufsize -1) {
562  av_log(avctx, AV_LOG_ERROR, "motion vector %d %d outside reference\n", x*s + mb->mv_x, y*s + mb->mv_y);
563  return AVERROR_INVALIDDATA;
564  }
565 
566  mb++;
567  if (ref_mb)
568  ref_mb++;
569  mb_offset += band->mb_size;
570  }
571 
572  offs += row_offset;
573  }
574 
575  align_get_bits(&ctx->gb);
576 
577  return 0;
578 }
579 
580 
581 /**
582  * Rearrange decoding and reference buffers.
583  *
584  * @param[in,out] ctx pointer to the decoder context
585  */
587 {
588  switch (ctx->prev_frame_type) {
589  case FRAMETYPE_INTRA:
590  case FRAMETYPE_INTRA1:
591  case FRAMETYPE_INTER:
592  ctx->buf_switch ^= 1;
593  ctx->dst_buf = ctx->buf_switch;
594  ctx->ref_buf = ctx->buf_switch ^ 1;
595  break;
597  break;
598  }
599 
600  switch (ctx->frame_type) {
601  case FRAMETYPE_INTRA:
602  case FRAMETYPE_INTRA1:
603  ctx->buf_switch = 0;
604  /* FALLTHROUGH */
605  case FRAMETYPE_INTER:
606  ctx->dst_buf = ctx->buf_switch;
607  ctx->ref_buf = ctx->buf_switch ^ 1;
608  break;
611  case FRAMETYPE_NULL_LAST:
612  break;
613  }
614 }
615 
616 
618 {
619  return ctx->frame_type < FRAMETYPE_NULL_FIRST;
620 }
621 
622 
624 {
625  IVI45DecContext *ctx = avctx->priv_data;
626 
628 
629  /* copy rvmap tables in our context so we can apply changes to them */
630  memcpy(ctx->rvmap_tabs, ff_ivi_rvmap_tabs, sizeof(ff_ivi_rvmap_tabs));
631 
632  /* Force allocation of the internal buffers */
633  /* during picture header decoding. */
634  ctx->pic_conf.pic_width = 0;
635  ctx->pic_conf.pic_height = 0;
636 
637  avctx->pix_fmt = AV_PIX_FMT_YUV410P;
638 
644 
645  return 0;
646 }
647 
648 
650  .name = "indeo4",
651  .type = AVMEDIA_TYPE_VIDEO,
652  .id = AV_CODEC_ID_INDEO4,
653  .priv_data_size = sizeof(IVI45DecContext),
654  .init = decode_init,
657  .long_name = NULL_IF_CONFIG_SMALL("Intel Indeo Video Interactive 4"),
658  .capabilities = CODEC_CAP_DR1,
659 };
int is_empty
= 1 if this band doesn&#39;t contain any data
Definition: ivi_common.h:142
uint32_t data_size
size of the frame data in bytes from picture header
Definition: ivi_common.h:205
uint8_t type
macroblock type: 0 - INTRA, 1 - INTER
Definition: ivi_common.h:102
int num_MBs
number of macroblocks in this tile
Definition: ivi_common.h:121
static const uint16_t ivi4_quant_8x8_intra[9][64]
Indeo 4 dequant tables.
Definition: indeo4data.h:89
static int scale_tile_size(int def_size, int size_factor)
Definition: indeo4.c:105
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
Close Indeo5 decoder and clean up its context.
Definition: ivi_common.c:931
This file contains data needed for the Indeo 4 decoder.
int(* is_nonnull_frame)(struct IVI45DecContext *ctx)
Definition: ivi_common.h:248
InvTransformPtr * inv_transform
Definition: ivi_common.h:162
#define IVI4_PIC_SIZE_ESC
Definition: indeo4.c:50
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_common.c:147
static int decode_pic_hdr(IVI45DecContext *ctx, AVCodecContext *avctx)
Decode Indeo 4 picture header.
Definition: indeo4.c:117
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
static int decode_plane_subdivision(GetBitContext *gb)
Decode subdivision of a plane.
Definition: indeo4.c:88
void( DCTransformPtr)(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
Definition: ivi_common.h:79
static void skip_bits_long(GetBitContext *s, int n)
Definition: get_bits.h:198
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
DC-only two-dimensional inverse Haar transform for Indeo 4.
Definition: ivi_dsp.c:323
int dst_buf
buffer index for the currently decoded frame
Definition: ivi_common.h:219
void ff_ivi_put_dc_pixel_8x8(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
Copy the DC coefficient into the first pixel of the block and zero all others.
Definition: ivi_dsp.c:569
DSP functions (inverse transforms, motion compensations, wavelet recompostion) for Indeo Video Intera...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int is_halfpel
precision of the motion compensation: 0 - fullpel, 1 - halfpel
Definition: ivi_common.h:145
uint8_t chroma_bands
Definition: ivi_common.h:195
int(* decode_pic_hdr)(struct IVI45DecContext *ctx, AVCodecContext *avctx)
Definition: ivi_common.h:244
#define FF_ARRAY_ELEMS(a)
int plane
plane number this band belongs to
Definition: ivi_common.h:131
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
int bufsize
band buffer size in bytes
Definition: ivi_common.h:168
bidirectional frame
Definition: indeo4.c:44
IVIPicConfig pic_conf
Definition: ivi_common.h:215
int quant_mat
dequant matrix index
Definition: ivi_common.h:149
void(* switch_buffers)(struct IVI45DecContext *ctx)
Definition: ivi_common.h:247
av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
Initialize planes (prepares descriptors, allocates buffers etc).
Definition: ivi_common.c:222
non-droppable P-frame
Definition: indeo4.c:43
void ff_ivi_put_pixels_8x8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
Copy the pixels into the frame buffer.
Definition: ivi_dsp.c:559
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
uint8_t luma_bands
Definition: ivi_common.h:194
VLC * tab
index of one of the predefined tables or "7" for custom one
Definition: ivi_common.h:54
#define av_cold
Definition: attributes.h:78
#define mb
uint8_t pic_glob_quant
Definition: ivi_common.h:229
const uint16_t * inter_base
quantization matrix for inter blocks
Definition: ivi_common.h:170
uint16_t pic_height
Definition: ivi_common.h:189
static const uint16_t ivi4_common_pic_sizes[14]
standard picture dimensions
Definition: indeo4data.h:37
int inherit_mv
tells if motion vector is inherited from reference macroblock
Definition: ivi_common.h:146
static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Decode Indeo 4 band header.
Definition: indeo4.c:281
uint16_t tile_height
Definition: ivi_common.h:193
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
GetBitContext gb
Definition: ivi_common.h:199
uint16_t chroma_width
Definition: ivi_common.h:190
int pitch
pitch associated with the buffers above
Definition: ivi_common.h:141
static const uint16_t ivi4_quant_8x8_inter[9][64]
Definition: indeo4data.h:182
uint8_t cbp
coded block pattern
Definition: ivi_common.h:103
uint16_t checksum
frame checksum
Definition: ivi_common.h:213
bitstream reader API header.
uint16_t pic_width
Definition: ivi_common.h:188
static const uint16_t ivi4_quant_4x4_inter[5][16]
Definition: indeo4data.h:308
void( InvTransformPtr)(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
Declare inverse transform function types.
Definition: ivi_common.h:78
int(* decode_band_hdr)(struct IVI45DecContext *ctx, IVIBandDesc *band, AVCodecContext *avctx)
Definition: ivi_common.h:245
IVIPlaneDesc planes[3]
color planes
Definition: ivi_common.h:216
void ff_ivi_row_slant8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
inverse 1D row slant transform
Definition: ivi_dsp.c:480
const uint16_t * intra_base
quantization matrix for intra blocks
Definition: ivi_common.h:169
void ff_ivi_dc_row_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
DC-only inverse row slant transform.
Definition: ivi_dsp.c:500
uint8_t unknown1
Definition: ivi_common.h:230
Discrete Time axis x
int blk_size
block size
Definition: ivi_common.h:144
const RVMapDesc ff_ivi_rvmap_tabs[9]
Run-value (RLE) tables.
Definition: ivi_common.c:1023
uint8_t corr[61 *2]
rvmap correction pairs
Definition: ivi_common.h:157
static const struct @57 transforms[18]
static int ivi_pic_config_cmp(IVIPicConfig *str1, IVIPicConfig *str2)
compare some properties of two pictures
Definition: ivi_common.h:255
void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
two-dimensional inverse Haar 8x8 transform for Indeo 4
Definition: ivi_dsp.c:268
RVMapDesc rvmap_tabs[9]
local corrected copy of the static rvmap tables
Definition: ivi_common.h:200
droppable P-frame
Definition: indeo4.c:45
#define IVI_VLC_BITS
max number of bits of the ivi&#39;s huffman codes
Definition: ivi_common.h:36
uint8_t in_q
flag for explicitly stored quantiser delta
Definition: ivi_common.h:228
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
This file contains structures and macros shared by both Indeo4 and Indeo5 decoders.
DCTransformPtr * dc_trans
Definition: indeo4.c:55
void ff_ivi_dc_col_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
DC-only inverse column slant transform.
Definition: ivi_dsp.c:545
int ref_buf
inter frame reference buffer index
Definition: ivi_common.h:220
DCTransformPtr * dc_transform
Definition: ivi_common.h:163
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static const uint8_t * scan_index_to_tab[15]
Definition: indeo4data.h:63
const char * name
Name of the codec implementation.
struct IVI45DecContext IVI45DecContext
external API header
int inherit_qdelta
tells if quantiser delta is inherited from reference macroblock
Definition: ivi_common.h:147
uint32_t frame_num
Definition: ivi_common.h:202
int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: ivi_common.c:844
int is_2d_trans
Definition: indeo4.c:56
IVIMbInfo * mbs
array of macroblock descriptors
Definition: ivi_common.h:122
empty frame with no data
Definition: indeo4.c:47
static void switch_buffers(IVI45DecContext *ctx)
Rearrange decoding and reference buffers.
Definition: indeo4.c:586
const uint8_t * inter_scale
quantization coefficient for inter blocks
Definition: ivi_common.h:172
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
uint16_t chroma_height
Definition: ivi_common.h:191
void ff_ivi_init_static_vlc(void)
Initialize static codes used for macroblock and block decoding.
Definition: ivi_common.c:103
int8_t q_delta
quant delta
Definition: ivi_common.h:104
static const uint8_t quant_index_to_tab[22]
Table for mapping quant matrix index from the bitstream into internal quant table number...
Definition: indeo4data.h:345
void ff_ivi_inverse_slant_8x8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
two-dimensional inverse slant 8x8 transform
Definition: ivi_dsp.c:387
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
uint16_t tile_width
Definition: ivi_common.h:192
NULL
Definition: eval.c:55
int ypos
Definition: ivi_common.h:115
IVIHuffTab mb_vlc
current macroblock table descriptor
Definition: ivi_common.h:223
int is_2d_trans
1 indicates that the two-dimensional inverse transform is used
Definition: ivi_common.h:164
int glob_quant
quant base for this band
Definition: ivi_common.h:150
int height
Definition: ivi_common.h:117
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int num_corr
number of correction entries
Definition: ivi_common.h:156
information for Indeo tile
Definition: ivi_common.h:113
int buf_switch
used to switch between three buffers
Definition: ivi_common.h:218
av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
Initialize tile and macroblock descriptors.
Definition: ivi_common.c:286
empty frame with no data
Definition: indeo4.c:46
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:74
uint8_t in_imf
Definition: ivi_common.h:227
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
synthesis window for stochastic i
static const uint16_t ivi4_quant_4x4_intra[5][16]
Definition: indeo4data.h:275
Huffman table is used for coding macroblocks.
Definition: ivi_common.h:63
IVIBandDesc * bands
array of band descriptors
Definition: ivi_common.h:183
int32_t checksum
for debug purposes
Definition: ivi_common.h:166
int rvmap_sel
rvmap table selector
Definition: ivi_common.h:158
int8_t mv_x
motion vector (x component)
Definition: ivi_common.h:105
int8_t mv_y
motion vector (y component)
Definition: ivi_common.h:106
int mb_size
macroblock size
Definition: ivi_common.h:143
intra frame with slightly different bitstream coding
Definition: indeo4.c:42
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
IVIMbInfo * ref_mbs
ptr to the macroblock descriptors of the reference tile
Definition: ivi_common.h:123
int xpos
Definition: ivi_common.h:114
IVIHuffTab blk_vlc
current block table descriptor
Definition: ivi_common.h:224
void ff_ivi_inverse_slant_4x4(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
two-dimensional inverse slant 4x4 transform
Definition: ivi_dsp.c:427
int16_t xpos
Definition: ivi_common.h:99
int band_num
band number
Definition: ivi_common.h:132
InvTransformPtr * inv_trans
Definition: indeo4.c:54
int transform_size
block size of the transform
Definition: ivi_common.h:165
static int is_nonnull_frame(IVI45DecContext *ctx)
Definition: indeo4.c:617
function y
Definition: D.m:1
static int decode_mb_info(IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Decode information (block type, cbp, quant delta, motion vector) for all macroblocks in the current t...
Definition: indeo4.c:451
const uint8_t * scan
ptr to the scan pattern
Definition: ivi_common.h:151
int width
Definition: ivi_common.h:116
static av_cold int decode_init(AVCodecContext *avctx)
Definition: indeo4.c:623
int checksum_present
Definition: ivi_common.h:167
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
static int ivi_scale_mv(int mv, int mv_scale)
scale motion vector
Definition: ivi_common.h:274
int transp_status
transparency mode status: 1 - enabled
Definition: ivi_common.h:207
void ff_ivi_dc_slant_2d(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size)
DC-only two-dimensional inverse slant transform.
Definition: ivi_dsp.c:467
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:418
int(* decode_mb_info)(struct IVI45DecContext *ctx, IVIBandDesc *band, IVITile *tile, AVCodecContext *avctx)
Definition: ivi_common.h:246
int16_t ypos
Definition: ivi_common.h:100
int prev_frame_type
frame type of the previous frame
Definition: ivi_common.h:204
information for Indeo macroblock (16x16, 8x8 or 4x4)
Definition: ivi_common.h:98
IVIHuffTab blk_vlc
vlc table for decoding block data
Definition: ivi_common.h:154
int scan_size
size of the scantable
Definition: ivi_common.h:152
const uint8_t * intra_scale
quantization coefficient for intra blocks
Definition: ivi_common.h:171
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
uint32_t buf_offs
address in the output buffer for this mb
Definition: ivi_common.h:101
#define IVI_TOSIGNED(val)
convert unsigned values into signed ones (the sign is in the LSB)
Definition: ivi_common.h:271
information for Indeo wavelet band
Definition: ivi_common.h:130
uint8_t rvmap_sel
Definition: ivi_common.h:226
AVCodec ff_indeo4_decoder
Definition: indeo4.c:649
void ff_ivi_col_slant8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags)
inverse 1D column slant transform
Definition: ivi_dsp.c:518