FFmpeg
indeo3.c
Go to the documentation of this file.
1 /*
2  * Indeo Video v3 compatible decoder
3  * Copyright (c) 2009 - 2011 Maxim Poliakovski
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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  * This is a decoder for Intel Indeo Video v3.
25  * It is based on vector quantization, run-length coding and motion compensation.
26  * Known container formats: .avi and .mov
27  * Known FOURCCs: 'IV31', 'IV32'
28  *
29  * @see http://wiki.multimedia.cx/index.php?title=Indeo_3
30  */
31 
32 #include "libavutil/imgutils.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/mem.h"
35 #include "libavutil/thread.h"
36 #include "avcodec.h"
37 #include "codec_internal.h"
38 #include "decode.h"
39 #include "copy_block.h"
40 #include "bytestream.h"
41 #include "get_bits.h"
42 #include "hpeldsp.h"
43 
44 #include "indeo3data.h"
45 
46 /* RLE opcodes. */
47 enum {
48  RLE_ESC_F9 = 249, ///< same as RLE_ESC_FA + do the same with next block
49  RLE_ESC_FA = 250, ///< INTRA: skip block, INTER: copy data from reference
50  RLE_ESC_FB = 251, ///< apply null delta to N blocks / skip N blocks
51  RLE_ESC_FC = 252, ///< same as RLE_ESC_FD + do the same with next block
52  RLE_ESC_FD = 253, ///< apply null delta to all remaining lines of this block
53  RLE_ESC_FE = 254, ///< apply null delta to all lines up to the 3rd line
54  RLE_ESC_FF = 255 ///< apply null delta to all lines up to the 2nd line
55 };
56 
57 
58 /* Some constants for parsing frame bitstream flags. */
59 #define BS_8BIT_PEL (1 << 1) ///< 8-bit pixel bitdepth indicator
60 #define BS_KEYFRAME (1 << 2) ///< intra frame indicator
61 #define BS_MV_Y_HALF (1 << 4) ///< vertical mv halfpel resolution indicator
62 #define BS_MV_X_HALF (1 << 5) ///< horizontal mv halfpel resolution indicator
63 #define BS_NONREF (1 << 8) ///< nonref (discardable) frame indicator
64 #define BS_BUFFER 9 ///< indicates which of two frame buffers should be used
65 
66 
67 typedef struct Plane {
68  uint8_t *buffers[2];
69  uint8_t *pixels[2]; ///< pointer to the actual pixel data of the buffers above
70  uint32_t width;
71  uint32_t height;
72  ptrdiff_t pitch;
73 } Plane;
74 
75 #define CELL_STACK_MAX 20
76 
77 typedef struct Cell {
78  int16_t xpos; ///< cell coordinates in 4x4 blocks
79  int16_t ypos;
80  int16_t width; ///< cell width in 4x4 blocks
81  int16_t height; ///< cell height in 4x4 blocks
82  uint8_t tree; ///< tree id: 0- MC tree, 1 - VQ tree
83  const int8_t *mv_ptr; ///< ptr to the motion vector if any
84 } Cell;
85 
86 typedef struct Indeo3DecodeContext {
89 
92  int skip_bits;
93  const uint8_t *next_cell_data;
94  const uint8_t *last_byte;
95  const int8_t *mc_vectors;
96  unsigned num_vectors; ///< number of motion vectors in mc_vectors
97 
98  int16_t width, height;
99  uint32_t frame_num; ///< current frame number (zero-based)
100  int data_size; ///< size of the frame data in bytes
101  uint16_t frame_flags; ///< frame properties
102  uint8_t cb_offset; ///< needed for selecting VQ tables
103  uint8_t buf_sel; ///< active frame buffer: 0 - primary, 1 -secondary
104  const uint8_t *y_data_ptr;
105  const uint8_t *v_data_ptr;
106  const uint8_t *u_data_ptr;
110  const uint8_t *alt_quant; ///< secondary VQ table set for the modes 1 and 4
113 
114 
115 static uint8_t requant_tab[8][128];
116 
117 /*
118  * Build the static requantization table.
119  * This table is used to remap pixel values according to a specific
120  * quant index and thus avoid overflows while adding deltas.
121  */
122 static av_cold void build_requant_tab(void)
123 {
124  static const int8_t offsets[8] = { 1, 1, 2, -3, -3, 3, 4, 4 };
125  static const int8_t deltas [8] = { 0, 1, 0, 4, 4, 1, 0, 1 };
126 
127  int i, j, step;
128 
129  for (i = 0; i < 8; i++) {
130  step = i + 2;
131  for (j = 0; j < 128; j++)
132  requant_tab[i][j] = (j + offsets[i]) / step * step + deltas[i];
133  }
134 
135  /* some last elements calculated above will have values >= 128 */
136  /* pixel values shall never exceed 127 so set them to non-overflowing values */
137  /* according with the quantization step of the respective section */
138  requant_tab[0][127] = 126;
139  requant_tab[1][119] = 118;
140  requant_tab[1][120] = 118;
141  requant_tab[2][126] = 124;
142  requant_tab[2][127] = 124;
143  requant_tab[6][124] = 120;
144  requant_tab[6][125] = 120;
145  requant_tab[6][126] = 120;
146  requant_tab[6][127] = 120;
147 
148  /* Patch for compatibility with the Intel's binary decoders */
149  requant_tab[1][7] = 10;
150  requant_tab[4][8] = 10;
151 }
152 
153 
155 {
156  int p;
157 
158  ctx->width = ctx->height = 0;
159 
160  for (p = 0; p < 3; p++) {
161  av_freep(&ctx->planes[p].buffers[0]);
162  av_freep(&ctx->planes[p].buffers[1]);
163  ctx->planes[p].pixels[0] = ctx->planes[p].pixels[1] = 0;
164  }
165 }
166 
167 
169  AVCodecContext *avctx, int luma_width, int luma_height)
170 {
171  int p, chroma_width, chroma_height;
172  int luma_size, chroma_size;
173  ptrdiff_t luma_pitch, chroma_pitch;
174 
175  luma_width = FFALIGN(luma_width , 2);
176  luma_height = FFALIGN(luma_height, 2);
177 
178  if (luma_width < 16 || luma_width > 640 ||
179  luma_height < 16 || luma_height > 480 ||
180  luma_width & 1 || luma_height & 1) {
181  av_log(avctx, AV_LOG_ERROR, "Invalid picture dimensions: %d x %d!\n",
182  luma_width, luma_height);
183  return AVERROR_INVALIDDATA;
184  }
185 
186  ctx->width = luma_width ;
187  ctx->height = luma_height;
188 
189  chroma_width = FFALIGN(luma_width >> 2, 4);
190  chroma_height = FFALIGN(luma_height >> 2, 4);
191 
192  luma_pitch = FFALIGN(luma_width, 16);
193  chroma_pitch = FFALIGN(chroma_width, 16);
194 
195  /* Calculate size of the luminance plane. */
196  /* Add one line more for INTRA prediction. */
197  luma_size = luma_pitch * (luma_height + 1);
198 
199  /* Calculate size of a chrominance planes. */
200  /* Add one line more for INTRA prediction. */
201  chroma_size = chroma_pitch * (chroma_height + 1);
202 
203  /* allocate frame buffers */
204  for (p = 0; p < 3; p++) {
205  ctx->planes[p].pitch = !p ? luma_pitch : chroma_pitch;
206  ctx->planes[p].width = !p ? luma_width : chroma_width;
207  ctx->planes[p].height = !p ? luma_height : chroma_height;
208 
209  ctx->planes[p].buffers[0] = av_malloc(!p ? luma_size : chroma_size);
210  ctx->planes[p].buffers[1] = av_malloc(!p ? luma_size : chroma_size);
211 
212  if (!ctx->planes[p].buffers[0] || !ctx->planes[p].buffers[1])
213  return AVERROR(ENOMEM);
214 
215  /* fill the INTRA prediction lines with the middle pixel value = 64 */
216  memset(ctx->planes[p].buffers[0], 0x40, ctx->planes[p].pitch);
217  memset(ctx->planes[p].buffers[1], 0x40, ctx->planes[p].pitch);
218 
219  /* set buffer pointers = buf_ptr + pitch and thus skip the INTRA prediction line */
220  ctx->planes[p].pixels[0] = ctx->planes[p].buffers[0] + ctx->planes[p].pitch;
221  ctx->planes[p].pixels[1] = ctx->planes[p].buffers[1] + ctx->planes[p].pitch;
222  memset(ctx->planes[p].pixels[0], 0, ctx->planes[p].pitch * ctx->planes[p].height);
223  memset(ctx->planes[p].pixels[1], 0, ctx->planes[p].pitch * ctx->planes[p].height);
224  }
225 
226  return 0;
227 }
228 
229 /**
230  * Copy pixels of the cell(x + mv_x, y + mv_y) from the previous frame into
231  * the cell(x, y) in the current frame.
232  *
233  * @param ctx pointer to the decoder context
234  * @param plane pointer to the plane descriptor
235  * @param cell pointer to the cell descriptor
236  */
237 static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
238 {
239  int h, w, mv_x, mv_y, offset, offset_dst;
240  uint8_t *src, *dst;
241 
242  /* setup output and reference pointers */
243  offset_dst = (cell->ypos << 2) * plane->pitch + (cell->xpos << 2);
244  dst = plane->pixels[ctx->buf_sel] + offset_dst;
245  if(cell->mv_ptr){
246  mv_y = cell->mv_ptr[0];
247  mv_x = cell->mv_ptr[1];
248  }else
249  mv_x= mv_y= 0;
250 
251  /* -1 because there is an extra line on top for prediction */
252  if ((cell->ypos << 2) + mv_y < -1 || (cell->xpos << 2) + mv_x < 0 ||
253  ((cell->ypos + cell->height) << 2) + mv_y > plane->height ||
254  ((cell->xpos + cell->width) << 2) + mv_x > plane->width) {
255  av_log(ctx->avctx, AV_LOG_ERROR,
256  "Motion vectors point out of the frame.\n");
257  return AVERROR_INVALIDDATA;
258  }
259 
260  offset = offset_dst + mv_y * plane->pitch + mv_x;
261  src = plane->pixels[ctx->buf_sel ^ 1] + offset;
262 
263  h = cell->height << 2;
264 
265  for (w = cell->width; w > 0;) {
266  /* copy using 16xH blocks */
267  if (!((cell->xpos << 2) & 15) && w >= 4) {
268  for (; w >= 4; src += 16, dst += 16, w -= 4)
269  ctx->hdsp.put_pixels_tab[0][0](dst, src, plane->pitch, h);
270  }
271 
272  /* copy using 8xH blocks */
273  if (!((cell->xpos << 2) & 7) && w >= 2) {
274  ctx->hdsp.put_pixels_tab[1][0](dst, src, plane->pitch, h);
275  w -= 2;
276  src += 8;
277  dst += 8;
278  } else if (w >= 1) {
279  ctx->hdsp.put_pixels_tab[2][0](dst, src, plane->pitch, h);
280  w--;
281  src += 4;
282  dst += 4;
283  }
284  }
285 
286  return 0;
287 }
288 
289 
290 /* Average 4/8 pixels at once without rounding using SWAR */
291 #define AVG_32(dst, src, ref) \
292  AV_WN32A(dst, ((AV_RN32(src) + AV_RN32(ref)) >> 1) & 0x7F7F7F7FUL)
293 
294 #define AVG_64(dst, src, ref) \
295  AV_WN64A(dst, ((AV_RN64(src) + AV_RN64(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL)
296 
297 
298 /*
299  * Replicate each even pixel as follows:
300  * ABCDEFGH -> AACCEEGG
301  */
302 static inline uint64_t replicate64(uint64_t a) {
303 #if HAVE_BIGENDIAN
304  a &= 0xFF00FF00FF00FF00ULL;
305  a |= a >> 8;
306 #else
307  a &= 0x00FF00FF00FF00FFULL;
308  a |= a << 8;
309 #endif
310  return a;
311 }
312 
313 static inline uint32_t replicate32(uint32_t a) {
314 #if HAVE_BIGENDIAN
315  a &= 0xFF00FF00UL;
316  a |= a >> 8;
317 #else
318  a &= 0x00FF00FFUL;
319  a |= a << 8;
320 #endif
321  return a;
322 }
323 
324 
325 /* Fill n lines with 64-bit pixel value pix */
326 static inline void fill_64(uint8_t *dst, const uint64_t pix, int32_t n,
327  int32_t row_offset)
328 {
329  for (; n > 0; dst += row_offset, n--)
330  AV_WN64A(dst, pix);
331 }
332 
333 
334 /* Error codes for cell decoding. */
335 enum {
342 };
343 
344 
345 #define BUFFER_PRECHECK \
346 if (*data_ptr >= last_ptr) \
347  return IV3_OUT_OF_DATA; \
348 
349 #define RLE_BLOCK_COPY \
350  if (cell->mv_ptr || !skip_flag) \
351  copy_block4(dst, ref, row_offset, row_offset, 4 << v_zoom)
352 
353 #define RLE_BLOCK_COPY_8 \
354  pix64 = AV_RN64(ref);\
355  if (is_first_row) {/* special prediction case: top line of a cell */\
356  pix64 = replicate64(pix64);\
357  fill_64(dst + row_offset, pix64, 7, row_offset);\
358  AVG_64(dst, ref, dst + row_offset);\
359  } else \
360  fill_64(dst, pix64, 8, row_offset)
361 
362 #define RLE_LINES_COPY \
363  copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom)
364 
365 #define RLE_LINES_COPY_M10 \
366  pix64 = AV_RN64(ref);\
367  if (is_top_of_cell) {\
368  pix64 = replicate64(pix64);\
369  fill_64(dst + row_offset, pix64, (num_lines << 1) - 1, row_offset);\
370  AVG_64(dst, ref, dst + row_offset);\
371  } else \
372  fill_64(dst, pix64, num_lines << 1, row_offset)
373 
374 #define APPLY_DELTA_4 \
375  AV_WN16A(dst + line_offset ,\
376  (AV_RN16(ref ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
377  AV_WN16A(dst + line_offset + 2,\
378  (AV_RN16(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
379  if (mode >= 3) {\
380  if (is_top_of_cell && !cell->ypos) {\
381  AV_COPY32U(dst, dst + row_offset);\
382  } else {\
383  AVG_32(dst, ref, dst + row_offset);\
384  }\
385  }
386 
387 #define APPLY_DELTA_8 \
388  /* apply two 32-bit VQ deltas to next even line */\
389  if (is_top_of_cell) { \
390  AV_WN32A(dst + row_offset , \
391  (replicate32(AV_RN32(ref )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
392  AV_WN32A(dst + row_offset + 4, \
393  (replicate32(AV_RN32(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
394  } else { \
395  AV_WN32A(dst + row_offset , \
396  (AV_RN32(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
397  AV_WN32A(dst + row_offset + 4, \
398  (AV_RN32(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
399  } \
400  /* odd lines are not coded but rather interpolated/replicated */\
401  /* first line of the cell on the top of image? - replicate */\
402  /* otherwise - interpolate */\
403  if (is_top_of_cell && !cell->ypos) {\
404  AV_COPY64U(dst, dst + row_offset);\
405  } else \
406  AVG_64(dst, ref, dst + row_offset);
407 
408 
409 #define APPLY_DELTA_1011_INTER \
410  if (mode == 10) { \
411  AV_WN32A(dst , \
412  (AV_RN32(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
413  AV_WN32A(dst + 4 , \
414  (AV_RN32(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
415  AV_WN32A(dst + row_offset , \
416  (AV_RN32(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
417  AV_WN32A(dst + row_offset + 4, \
418  (AV_RN32(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
419  } else { \
420  AV_WN16A(dst , \
421  (AV_RN16(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
422  AV_WN16A(dst + 2 , \
423  (AV_RN16(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\
424  AV_WN16A(dst + row_offset , \
425  (AV_RN16(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
426  AV_WN16A(dst + row_offset + 2, \
427  (AV_RN16(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
428  }
429 
430 
432  uint8_t *block, uint8_t *ref_block,
433  ptrdiff_t row_offset, int h_zoom, int v_zoom, int mode,
434  const vqEntry *delta[2], int swap_quads[2],
435  const uint8_t **data_ptr, const uint8_t *last_ptr)
436 {
437  int x, y, line, num_lines;
438  int rle_blocks = 0;
439  uint8_t code, *dst, *ref;
440  const vqEntry *delta_tab;
441  unsigned int dyad1, dyad2;
442  uint64_t pix64;
443  int skip_flag = 0, is_top_of_cell, is_first_row = 1;
444  int blk_row_offset, line_offset;
445 
446  blk_row_offset = (row_offset << (2 + v_zoom)) - (cell->width << 2);
447  line_offset = v_zoom ? row_offset : 0;
448 
449  if (cell->height & v_zoom || cell->width & h_zoom)
450  return IV3_BAD_DATA;
451 
452  for (y = 0; y < cell->height; is_first_row = 0, y += 1 + v_zoom) {
453  for (x = 0; x < cell->width; x += 1 + h_zoom) {
454  ref = ref_block;
455  dst = block;
456 
457  if (rle_blocks > 0) {
458  if (mode <= 4) {
460  } else if (mode == 10 && !cell->mv_ptr) {
462  }
463  rle_blocks--;
464  } else {
465  for (line = 0; line < 4;) {
466  num_lines = 1;
467  is_top_of_cell = is_first_row && !line;
468 
469  /* select primary VQ table for odd, secondary for even lines */
470  if (mode <= 4)
471  delta_tab = delta[line & 1];
472  else
473  delta_tab = delta[1];
475  code = bytestream_get_byte(data_ptr);
476  if (code < 248) {
477  if (code < delta_tab->num_dyads) {
479  dyad1 = bytestream_get_byte(data_ptr);
480  dyad2 = code;
481  if (dyad1 >= delta_tab->num_dyads || dyad1 >= 248)
482  return IV3_BAD_DATA;
483  } else {
484  /* process QUADS */
485  code -= delta_tab->num_dyads;
486  dyad1 = code / delta_tab->quad_exp;
487  dyad2 = code % delta_tab->quad_exp;
488  if (swap_quads[line & 1])
489  FFSWAP(unsigned int, dyad1, dyad2);
490  }
491  if (mode <= 4) {
493  } else if (mode == 10 && !cell->mv_ptr) {
495  } else {
497  }
498  } else {
499  /* process RLE codes */
500  switch (code) {
501  case RLE_ESC_FC:
502  skip_flag = 0;
503  rle_blocks = 1;
504  code = 253;
505  /* FALLTHROUGH */
506  case RLE_ESC_FF:
507  case RLE_ESC_FE:
508  case RLE_ESC_FD:
509  num_lines = 257 - code - line;
510  if (num_lines <= 0)
511  return IV3_BAD_RLE;
512  if (mode <= 4) {
514  } else if (mode == 10 && !cell->mv_ptr) {
516  }
517  break;
518  case RLE_ESC_FB:
520  code = bytestream_get_byte(data_ptr);
521  rle_blocks = (code & 0x1F) - 1; /* set block counter */
522  if (code >= 64 || rle_blocks < 0)
523  return IV3_BAD_COUNTER;
524  skip_flag = code & 0x20;
525  num_lines = 4 - line; /* enforce next block processing */
526  if (mode >= 10 || (cell->mv_ptr || !skip_flag)) {
527  if (mode <= 4) {
529  } else if (mode == 10 && !cell->mv_ptr) {
531  }
532  }
533  break;
534  case RLE_ESC_F9:
535  skip_flag = 1;
536  rle_blocks = 1;
537  /* FALLTHROUGH */
538  case RLE_ESC_FA:
539  if (line)
540  return IV3_BAD_RLE;
541  num_lines = 4; /* enforce next block processing */
542  if (cell->mv_ptr) {
543  if (mode <= 4) {
545  } else if (mode == 10 && !cell->mv_ptr) {
547  }
548  }
549  break;
550  default:
551  return IV3_UNSUPPORTED;
552  }
553  }
554 
555  line += num_lines;
556  ref += row_offset * (num_lines << v_zoom);
557  dst += row_offset * (num_lines << v_zoom);
558  }
559  }
560 
561  /* move to next horizontal block */
562  block += 4 << h_zoom;
563  ref_block += 4 << h_zoom;
564  }
565 
566  /* move to next line of blocks */
567  ref_block += blk_row_offset;
568  block += blk_row_offset;
569  }
570  return IV3_NOERR;
571 }
572 
573 
574 /**
575  * Decode a vector-quantized cell.
576  * It consists of several routines, each of which handles one or more "modes"
577  * with which a cell can be encoded.
578  *
579  * @param ctx pointer to the decoder context
580  * @param avctx ptr to the AVCodecContext
581  * @param plane pointer to the plane descriptor
582  * @param cell pointer to the cell descriptor
583  * @param data_ptr pointer to the compressed data
584  * @param last_ptr pointer to the last byte to catch reads past end of buffer
585  * @return number of consumed bytes or negative number in case of error
586  */
588  Plane *plane, Cell *cell, const uint8_t *data_ptr,
589  const uint8_t *last_ptr)
590 {
591  int x, mv_x, mv_y, mode, vq_index, prim_indx, second_indx;
592  int zoom_fac;
593  int offset, error = 0, swap_quads[2];
594  uint8_t code, *block, *ref_block = 0;
595  const vqEntry *delta[2];
596  const uint8_t *data_start = data_ptr;
597 
598  /* get coding mode and VQ table index from the VQ descriptor byte */
599  code = *data_ptr++;
600  mode = code >> 4;
601  vq_index = code & 0xF;
602 
603  /* setup output and reference pointers */
604  offset = (cell->ypos << 2) * plane->pitch + (cell->xpos << 2);
605  block = plane->pixels[ctx->buf_sel] + offset;
606 
607  if (!cell->mv_ptr) {
608  /* use previous line as reference for INTRA cells */
609  ref_block = block - plane->pitch;
610  } else if (mode >= 10) {
611  /* for mode 10 and 11 INTER first copy the predicted cell into the current one */
612  /* so we don't need to do data copying for each RLE code later */
613  int ret = copy_cell(ctx, plane, cell);
614  if (ret < 0)
615  return ret;
616  } else {
617  /* set the pointer to the reference pixels for modes 0-4 INTER */
618  mv_y = cell->mv_ptr[0];
619  mv_x = cell->mv_ptr[1];
620 
621  /* -1 because there is an extra line on top for prediction */
622  if ((cell->ypos << 2) + mv_y < -1 || (cell->xpos << 2) + mv_x < 0 ||
623  ((cell->ypos + cell->height) << 2) + mv_y > plane->height ||
624  ((cell->xpos + cell->width) << 2) + mv_x > plane->width) {
625  av_log(ctx->avctx, AV_LOG_ERROR,
626  "Motion vectors point out of the frame.\n");
627  return AVERROR_INVALIDDATA;
628  }
629 
630  offset += mv_y * plane->pitch + mv_x;
631  ref_block = plane->pixels[ctx->buf_sel ^ 1] + offset;
632  }
633 
634  /* select VQ tables as follows: */
635  /* modes 0 and 3 use only the primary table for all lines in a block */
636  /* while modes 1 and 4 switch between primary and secondary tables on alternate lines */
637  if (mode == 1 || mode == 4) {
638  code = ctx->alt_quant[vq_index];
639  prim_indx = (code >> 4) + ctx->cb_offset;
640  second_indx = (code & 0xF) + ctx->cb_offset;
641  } else {
642  vq_index += ctx->cb_offset;
643  prim_indx = second_indx = vq_index;
644  }
645 
646  if (prim_indx >= 24 || second_indx >= 24) {
647  av_log(avctx, AV_LOG_ERROR, "Invalid VQ table indexes! Primary: %d, secondary: %d!\n",
648  prim_indx, second_indx);
649  return AVERROR_INVALIDDATA;
650  }
651 
652  delta[0] = &vq_tab[second_indx];
653  delta[1] = &vq_tab[prim_indx];
654  swap_quads[0] = second_indx >= 16;
655  swap_quads[1] = prim_indx >= 16;
656 
657  /* requantize the prediction if VQ index of this cell differs from VQ index */
658  /* of the predicted cell in order to avoid overflows. */
659  if (vq_index >= 8 && ref_block) {
660  for (x = 0; x < cell->width << 2; x++)
661  ref_block[x] = requant_tab[vq_index & 7][ref_block[x] & 127];
662  }
663 
664  error = IV3_NOERR;
665 
666  switch (mode) {
667  case 0: /*------------------ MODES 0 & 1 (4x4 block processing) --------------------*/
668  case 1:
669  case 3: /*------------------ MODES 3 & 4 (4x8 block processing) --------------------*/
670  case 4:
671  if (mode >= 3 && cell->mv_ptr) {
672  av_log(avctx, AV_LOG_ERROR, "Attempt to apply Mode 3/4 to an INTER cell!\n");
673  return AVERROR_INVALIDDATA;
674  }
675 
676  zoom_fac = mode >= 3;
677  error = decode_cell_data(ctx, cell, block, ref_block, plane->pitch,
678  0, zoom_fac, mode, delta, swap_quads,
679  &data_ptr, last_ptr);
680  break;
681  case 10: /*-------------------- MODE 10 (8x8 block processing) ---------------------*/
682  case 11: /*----------------- MODE 11 (4x8 INTER block processing) ------------------*/
683  if (mode == 10 && !cell->mv_ptr) { /* MODE 10 INTRA processing */
684  error = decode_cell_data(ctx, cell, block, ref_block, plane->pitch,
685  1, 1, mode, delta, swap_quads,
686  &data_ptr, last_ptr);
687  } else { /* mode 10 and 11 INTER processing */
688  if (mode == 11 && !cell->mv_ptr) {
689  av_log(avctx, AV_LOG_ERROR, "Attempt to use Mode 11 for an INTRA cell!\n");
690  return AVERROR_INVALIDDATA;
691  }
692 
693  zoom_fac = mode == 10;
694  error = decode_cell_data(ctx, cell, block, ref_block, plane->pitch,
695  zoom_fac, 1, mode, delta, swap_quads,
696  &data_ptr, last_ptr);
697  }
698  break;
699  default:
700  av_log(avctx, AV_LOG_ERROR, "Unsupported coding mode: %d\n", mode);
701  return AVERROR_INVALIDDATA;
702  }//switch mode
703 
704  switch (error) {
705  case IV3_BAD_RLE:
706  av_log(avctx, AV_LOG_ERROR, "Mode %d: RLE code %X is not allowed at the current line\n",
707  mode, data_ptr[-1]);
708  return AVERROR_INVALIDDATA;
709  case IV3_BAD_DATA:
710  av_log(avctx, AV_LOG_ERROR, "Mode %d: invalid VQ data\n", mode);
711  return AVERROR_INVALIDDATA;
712  case IV3_BAD_COUNTER:
713  av_log(avctx, AV_LOG_ERROR, "Mode %d: RLE-FB invalid counter: %d\n", mode, code);
714  return AVERROR_INVALIDDATA;
715  case IV3_UNSUPPORTED:
716  av_log(avctx, AV_LOG_ERROR, "Mode %d: unsupported RLE code: %X\n", mode, data_ptr[-1]);
717  return AVERROR_INVALIDDATA;
718  case IV3_OUT_OF_DATA:
719  av_log(avctx, AV_LOG_ERROR, "Mode %d: attempt to read past end of buffer\n", mode);
720  return AVERROR_INVALIDDATA;
721  }
722 
723  return data_ptr - data_start; /* report number of bytes consumed from the input buffer */
724 }
725 
726 
727 /* Binary tree codes. */
728 enum {
729  H_SPLIT = 0,
730  V_SPLIT = 1,
733 };
734 
735 
736 #define SPLIT_CELL(size, new_size) (new_size) = ((size) > 2) ? ((((size) + 2) >> 2) << 1) : 1
737 
738 #define UPDATE_BITPOS(n) \
739  ctx->skip_bits += (n); \
740  ctx->need_resync = 1
741 
742 #define RESYNC_BITSTREAM \
743  if (ctx->need_resync && !(get_bits_count(&ctx->gb) & 7)) { \
744  skip_bits_long(&ctx->gb, ctx->skip_bits); \
745  ctx->skip_bits = 0; \
746  ctx->need_resync = 0; \
747  }
748 
749 #define CHECK_CELL \
750  if (curr_cell.xpos + curr_cell.width > (plane->width >> 2) || \
751  curr_cell.ypos + curr_cell.height > (plane->height >> 2)) { \
752  av_log(avctx, AV_LOG_ERROR, "Invalid cell: x=%d, y=%d, w=%d, h=%d\n", \
753  curr_cell.xpos, curr_cell.ypos, curr_cell.width, curr_cell.height); \
754  return AVERROR_INVALIDDATA; \
755  }
756 
757 
759  Plane *plane, int code, Cell *ref_cell,
760  const int depth, const int strip_width)
761 {
762  Cell curr_cell;
763  int bytes_used, ret;
764 
765  if (depth <= 0) {
766  av_log(avctx, AV_LOG_ERROR, "Stack overflow (corrupted binary tree)!\n");
767  return AVERROR_INVALIDDATA; // unwind recursion
768  }
769 
770  curr_cell = *ref_cell; // clone parent cell
771  if (code == H_SPLIT) {
772  SPLIT_CELL(ref_cell->height, curr_cell.height);
773  ref_cell->ypos += curr_cell.height;
774  ref_cell->height -= curr_cell.height;
775  if (ref_cell->height <= 0 || curr_cell.height <= 0)
776  return AVERROR_INVALIDDATA;
777  } else if (code == V_SPLIT) {
778  if (curr_cell.width > strip_width) {
779  /* split strip */
780  curr_cell.width = (curr_cell.width <= (strip_width << 1) ? 1 : 2) * strip_width;
781  } else
782  SPLIT_CELL(ref_cell->width, curr_cell.width);
783  ref_cell->xpos += curr_cell.width;
784  ref_cell->width -= curr_cell.width;
785  if (ref_cell->width <= 0 || curr_cell.width <= 0)
786  return AVERROR_INVALIDDATA;
787  }
788 
789  while (get_bits_left(&ctx->gb) >= 2) { /* loop until return */
791  switch (code = get_bits(&ctx->gb, 2)) {
792  case H_SPLIT:
793  case V_SPLIT:
794  if (parse_bintree(ctx, avctx, plane, code, &curr_cell, depth - 1, strip_width))
795  return AVERROR_INVALIDDATA;
796  break;
797  case INTRA_NULL:
798  if (!curr_cell.tree) { /* MC tree INTRA code */
799  curr_cell.mv_ptr = 0; /* mark the current strip as INTRA */
800  curr_cell.tree = 1; /* enter the VQ tree */
801  } else { /* VQ tree NULL code */
803  code = get_bits(&ctx->gb, 2);
804  if (code >= 2) {
805  av_log(avctx, AV_LOG_ERROR, "Invalid VQ_NULL code: %d\n", code);
806  return AVERROR_INVALIDDATA;
807  }
808  if (code == 1)
809  av_log(avctx, AV_LOG_ERROR, "SkipCell procedure not implemented yet!\n");
810 
811  CHECK_CELL
812  if (!curr_cell.mv_ptr)
813  return AVERROR_INVALIDDATA;
814 
815  ret = copy_cell(ctx, plane, &curr_cell);
816  return ret;
817  }
818  break;
819  case INTER_DATA:
820  if (!curr_cell.tree) { /* MC tree INTER code */
821  unsigned mv_idx;
822  /* get motion vector index and setup the pointer to the mv set */
823  if (!ctx->need_resync)
824  ctx->next_cell_data = &ctx->gb.buffer[(get_bits_count(&ctx->gb) + 7) >> 3];
825  if (ctx->next_cell_data >= ctx->last_byte) {
826  av_log(avctx, AV_LOG_ERROR, "motion vector out of array\n");
827  return AVERROR_INVALIDDATA;
828  }
829  mv_idx = *(ctx->next_cell_data++);
830  if (mv_idx >= ctx->num_vectors) {
831  av_log(avctx, AV_LOG_ERROR, "motion vector index out of range\n");
832  return AVERROR_INVALIDDATA;
833  }
834  curr_cell.mv_ptr = &ctx->mc_vectors[mv_idx << 1];
835  curr_cell.tree = 1; /* enter the VQ tree */
836  UPDATE_BITPOS(8);
837  } else { /* VQ tree DATA code */
838  if (!ctx->need_resync)
839  ctx->next_cell_data = &ctx->gb.buffer[(get_bits_count(&ctx->gb) + 7) >> 3];
840 
841  CHECK_CELL
842  bytes_used = decode_cell(ctx, avctx, plane, &curr_cell,
843  ctx->next_cell_data, ctx->last_byte);
844  if (bytes_used < 0)
845  return AVERROR_INVALIDDATA;
846 
847  UPDATE_BITPOS(bytes_used << 3);
848  ctx->next_cell_data += bytes_used;
849  return 0;
850  }
851  break;
852  }
853  }//while
854 
855  return AVERROR_INVALIDDATA;
856 }
857 
858 
860  Plane *plane, const uint8_t *data, int32_t data_size,
861  int32_t strip_width)
862 {
863  Cell curr_cell;
864  unsigned num_vectors;
865 
866  /* each plane data starts with mc_vector_count field, */
867  /* an optional array of motion vectors followed by the vq data */
868  num_vectors = bytestream_get_le32(&data); data_size -= 4;
869  if (num_vectors > 256) {
870  av_log(ctx->avctx, AV_LOG_ERROR,
871  "Read invalid number of motion vectors %d\n", num_vectors);
872  return AVERROR_INVALIDDATA;
873  }
874  if (num_vectors * 2 > data_size)
875  return AVERROR_INVALIDDATA;
876 
877  ctx->num_vectors = num_vectors;
878  ctx->mc_vectors = num_vectors ? data : 0;
879 
880  /* init the bitreader */
881  init_get_bits(&ctx->gb, &data[num_vectors * 2], (data_size - num_vectors * 2) << 3);
882  ctx->skip_bits = 0;
883  ctx->need_resync = 0;
884 
885  ctx->last_byte = data + data_size;
886 
887  /* initialize the 1st cell and set its dimensions to whole plane */
888  curr_cell.xpos = curr_cell.ypos = 0;
889  curr_cell.width = plane->width >> 2;
890  curr_cell.height = plane->height >> 2;
891  curr_cell.tree = 0; // we are in the MC tree now
892  curr_cell.mv_ptr = 0; // no motion vector = INTRA cell
893 
894  return parse_bintree(ctx, avctx, plane, INTRA_NULL, &curr_cell, CELL_STACK_MAX, strip_width);
895 }
896 
897 
898 #define OS_HDR_ID MKBETAG('F', 'R', 'M', 'H')
899 
901  const uint8_t *buf, int buf_size)
902 {
903  GetByteContext gb;
904  const uint8_t *bs_hdr;
905  uint32_t frame_num, word2, check_sum, data_size;
906  int y_offset, u_offset, v_offset;
907  uint32_t starts[3], ends[3];
908  uint16_t height, width;
909  int i, j;
910 
911  bytestream2_init(&gb, buf, buf_size);
912 
913  /* parse and check the OS header */
914  frame_num = bytestream2_get_le32(&gb);
915  word2 = bytestream2_get_le32(&gb);
916  check_sum = bytestream2_get_le32(&gb);
917  data_size = bytestream2_get_le32(&gb);
918 
919  if ((frame_num ^ word2 ^ data_size ^ OS_HDR_ID) != check_sum) {
920  av_log(avctx, AV_LOG_ERROR, "OS header checksum mismatch!\n");
921  return AVERROR_INVALIDDATA;
922  }
923 
924  /* parse the bitstream header */
925  bs_hdr = gb.buffer;
926 
927  if (bytestream2_get_le16(&gb) != 32) {
928  av_log(avctx, AV_LOG_ERROR, "Unsupported codec version!\n");
929  return AVERROR_INVALIDDATA;
930  }
931 
932  ctx->frame_num = frame_num;
933  ctx->frame_flags = bytestream2_get_le16(&gb);
934  ctx->data_size = (bytestream2_get_le32(&gb) + 7) >> 3;
935  ctx->cb_offset = bytestream2_get_byte(&gb);
936 
937  if (ctx->data_size == 16)
938  return 4;
939  ctx->data_size = FFMIN(ctx->data_size, buf_size - 16);
940 
941  bytestream2_skip(&gb, 3); // skip reserved byte and checksum
942 
943  /* check frame dimensions */
944  height = bytestream2_get_le16(&gb);
945  width = bytestream2_get_le16(&gb);
946  if (av_image_check_size(width, height, 0, avctx))
947  return AVERROR_INVALIDDATA;
948 
949  if (width != ctx->width || height != ctx->height) {
950  int res;
951 
952  ff_dlog(avctx, "Frame dimensions changed!\n");
953 
954  if (width < 16 || width > 640 ||
955  height < 16 || height > 480 ||
956  width & 3 || height & 3) {
957  av_log(avctx, AV_LOG_ERROR,
958  "Invalid picture dimensions: %d x %d!\n", width, height);
959  return AVERROR_INVALIDDATA;
960  }
962  if ((res = allocate_frame_buffers(ctx, avctx, width, height)) < 0)
963  return res;
964  if ((res = ff_set_dimensions(avctx, width, height)) < 0)
965  return res;
966  }
967 
968  y_offset = bytestream2_get_le32(&gb);
969  v_offset = bytestream2_get_le32(&gb);
970  u_offset = bytestream2_get_le32(&gb);
971  bytestream2_skip(&gb, 4);
972 
973  /* unfortunately there is no common order of planes in the buffer */
974  /* so we use that sorting algo for determining planes data sizes */
975  starts[0] = y_offset;
976  starts[1] = v_offset;
977  starts[2] = u_offset;
978 
979  for (j = 0; j < 3; j++) {
980  ends[j] = ctx->data_size;
981  for (i = 2; i >= 0; i--)
982  if (starts[i] < ends[j] && starts[i] > starts[j])
983  ends[j] = starts[i];
984  }
985 
986  ctx->y_data_size = ends[0] - starts[0];
987  ctx->v_data_size = ends[1] - starts[1];
988  ctx->u_data_size = ends[2] - starts[2];
989  if (FFMIN3(y_offset, v_offset, u_offset) < 0 ||
990  FFMAX3(y_offset, v_offset, u_offset) >= ctx->data_size - 16 ||
991  FFMIN3(y_offset, v_offset, u_offset) < gb.buffer - bs_hdr + 16 ||
992  FFMIN3(ctx->y_data_size, ctx->v_data_size, ctx->u_data_size) <= 0) {
993  av_log(avctx, AV_LOG_ERROR, "One of the y/u/v offsets is invalid\n");
994  return AVERROR_INVALIDDATA;
995  }
996 
997  ctx->y_data_ptr = bs_hdr + y_offset;
998  ctx->v_data_ptr = bs_hdr + v_offset;
999  ctx->u_data_ptr = bs_hdr + u_offset;
1000  ctx->alt_quant = gb.buffer;
1001 
1002  if (ctx->data_size == 16) {
1003  av_log(avctx, AV_LOG_DEBUG, "Sync frame encountered!\n");
1004  return 16;
1005  }
1006 
1007  if (ctx->frame_flags & BS_8BIT_PEL) {
1008  avpriv_request_sample(avctx, "8-bit pixel format");
1009  return AVERROR_PATCHWELCOME;
1010  }
1011 
1012  if (ctx->frame_flags & BS_MV_X_HALF || ctx->frame_flags & BS_MV_Y_HALF) {
1013  avpriv_request_sample(avctx, "Halfpel motion vectors");
1014  return AVERROR_PATCHWELCOME;
1015  }
1016 
1017  return 0;
1018 }
1019 
1020 
1021 /**
1022  * Convert and output the current plane.
1023  * All pixel values will be upsampled by shifting right by one bit.
1024  *
1025  * @param[in] plane pointer to the descriptor of the plane being processed
1026  * @param[in] buf_sel indicates which frame buffer the input data stored in
1027  * @param[out] dst pointer to the buffer receiving converted pixels
1028  * @param[in] dst_pitch pitch for moving to the next y line
1029  * @param[in] dst_height output plane height
1030  */
1031 static void output_plane(const Plane *plane, int buf_sel, uint8_t *dst,
1032  ptrdiff_t dst_pitch, int dst_height)
1033 {
1034  int x,y;
1035  const uint8_t *src = plane->pixels[buf_sel];
1036  ptrdiff_t pitch = plane->pitch;
1037 
1038  dst_height = FFMIN(dst_height, plane->height);
1039  for (y = 0; y < dst_height; y++) {
1040  /* convert four pixels at once using SWAR */
1041  for (x = 0; x < plane->width >> 2; x++) {
1042  AV_WN32A(dst, (AV_RN32A(src) & 0x7F7F7F7F) << 1);
1043  src += 4;
1044  dst += 4;
1045  }
1046 
1047  for (x <<= 2; x < plane->width; x++)
1048  *dst++ = *src++ << 1;
1049 
1050  src += pitch - plane->width;
1051  dst += dst_pitch - plane->width;
1052  }
1053 }
1054 
1055 
1057 {
1058  static AVOnce init_static_once = AV_ONCE_INIT;
1059  Indeo3DecodeContext *ctx = avctx->priv_data;
1060 
1061  ctx->avctx = avctx;
1062  avctx->pix_fmt = AV_PIX_FMT_YUV410P;
1063 
1064  ff_thread_once(&init_static_once, build_requant_tab);
1065 
1066  ff_hpeldsp_init(&ctx->hdsp, avctx->flags);
1067 
1068  return allocate_frame_buffers(ctx, avctx, avctx->width, avctx->height);
1069 }
1070 
1071 
1073  int *got_frame, AVPacket *avpkt)
1074 {
1075  Indeo3DecodeContext *ctx = avctx->priv_data;
1076  const uint8_t *buf = avpkt->data;
1077  int buf_size = avpkt->size;
1078  int res;
1079 
1080  res = decode_frame_headers(ctx, avctx, buf, buf_size);
1081  if (res < 0)
1082  return res;
1083 
1084  /* skip sync(null) frames */
1085  if (res) {
1086  // we have processed 16 bytes but no data was decoded
1087  *got_frame = 0;
1088  return buf_size;
1089  }
1090 
1091  /* skip droppable INTER frames if requested */
1092  if (ctx->frame_flags & BS_NONREF &&
1093  (avctx->skip_frame >= AVDISCARD_NONREF))
1094  return 0;
1095 
1096  /* skip INTER frames if requested */
1097  if (!(ctx->frame_flags & BS_KEYFRAME) && avctx->skip_frame >= AVDISCARD_NONKEY)
1098  return 0;
1099 
1100  /* use BS_BUFFER flag for buffer switching */
1101  ctx->buf_sel = (ctx->frame_flags >> BS_BUFFER) & 1;
1102 
1103  if ((res = ff_get_buffer(avctx, frame, 0)) < 0)
1104  return res;
1105 
1106  /* decode luma plane */
1107  if ((res = decode_plane(ctx, avctx, ctx->planes, ctx->y_data_ptr, ctx->y_data_size, 40)))
1108  return res;
1109 
1110  /* decode chroma planes */
1111  if ((res = decode_plane(ctx, avctx, &ctx->planes[1], ctx->u_data_ptr, ctx->u_data_size, 10)))
1112  return res;
1113 
1114  if ((res = decode_plane(ctx, avctx, &ctx->planes[2], ctx->v_data_ptr, ctx->v_data_size, 10)))
1115  return res;
1116 
1117  output_plane(&ctx->planes[0], ctx->buf_sel,
1118  frame->data[0], frame->linesize[0],
1119  avctx->height);
1120  output_plane(&ctx->planes[1], ctx->buf_sel,
1121  frame->data[1], frame->linesize[1],
1122  (avctx->height + 3) >> 2);
1123  output_plane(&ctx->planes[2], ctx->buf_sel,
1124  frame->data[2], frame->linesize[2],
1125  (avctx->height + 3) >> 2);
1126 
1127  *got_frame = 1;
1128 
1129  return buf_size;
1130 }
1131 
1132 
1134 {
1135  free_frame_buffers(avctx->priv_data);
1136 
1137  return 0;
1138 }
1139 
1141  .p.name = "indeo3",
1142  CODEC_LONG_NAME("Intel Indeo 3"),
1143  .p.type = AVMEDIA_TYPE_VIDEO,
1144  .p.id = AV_CODEC_ID_INDEO3,
1145  .priv_data_size = sizeof(Indeo3DecodeContext),
1146  .init = decode_init,
1147  .close = decode_close,
1149  .p.capabilities = AV_CODEC_CAP_DR1,
1150  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1151 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
IV3_UNSUPPORTED
@ IV3_UNSUPPORTED
Definition: indeo3.c:340
IV3_BAD_RLE
@ IV3_BAD_RLE
Definition: indeo3.c:337
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:43
APPLY_DELTA_8
#define APPLY_DELTA_8
Definition: indeo3.c:387
vq_tab
static const vqEntry vq_tab[24]
Definition: indeo3data.h:330
IV3_NOERR
@ IV3_NOERR
Definition: indeo3.c:336
RLE_ESC_F9
@ RLE_ESC_F9
same as RLE_ESC_FA + do the same with next block
Definition: indeo3.c:48
BS_NONREF
#define BS_NONREF
nonref (discardable) frame indicator
Definition: indeo3.c:63
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
Cell::height
int16_t height
cell height in 4x4 blocks
Definition: indeo3.c:81
APPLY_DELTA_4
#define APPLY_DELTA_4
Definition: indeo3.c:374
GetByteContext
Definition: bytestream.h:33
OS_HDR_ID
#define OS_HDR_ID
Definition: indeo3.c:898
thread.h
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:266
decode_close
static av_cold int decode_close(AVCodecContext *avctx)
Definition: indeo3.c:1133
mode
Definition: swscale.c:52
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:403
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
BS_MV_Y_HALF
#define BS_MV_Y_HALF
vertical mv halfpel resolution indicator
Definition: indeo3.c:61
w
uint8_t w
Definition: llviddspenc.c:38
AV_CODEC_ID_INDEO3
@ AV_CODEC_ID_INDEO3
Definition: codec_id.h:80
AVPacket::data
uint8_t * data
Definition: packet.h:539
data
const char data[16]
Definition: mxf.c:149
decode_frame_headers
static int decode_frame_headers(Indeo3DecodeContext *ctx, AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Definition: indeo3.c:900
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition: indeo3.c:1072
FFCodec
Definition: codec_internal.h:127
Indeo3DecodeContext::alt_quant
const uint8_t * alt_quant
secondary VQ table set for the modes 1 and 4
Definition: indeo3.c:110
AV_WN32A
#define AV_WN32A(p, v)
Definition: intreadwrite.h:534
BS_MV_X_HALF
#define BS_MV_X_HALF
horizontal mv halfpel resolution indicator
Definition: indeo3.c:62
CELL_STACK_MAX
#define CELL_STACK_MAX
Definition: indeo3.c:75
decode_cell
static int decode_cell(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, Cell *cell, const uint8_t *data_ptr, const uint8_t *last_ptr)
Decode a vector-quantized cell.
Definition: indeo3.c:587
Indeo3DecodeContext::mc_vectors
const int8_t * mc_vectors
Definition: indeo3.c:95
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
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:514
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
BUFFER_PRECHECK
#define BUFFER_PRECHECK
Definition: indeo3.c:345
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
decode_cell_data
static int decode_cell_data(Indeo3DecodeContext *ctx, Cell *cell, uint8_t *block, uint8_t *ref_block, ptrdiff_t row_offset, int h_zoom, int v_zoom, int mode, const vqEntry *delta[2], int swap_quads[2], const uint8_t **data_ptr, const uint8_t *last_ptr)
Definition: indeo3.c:431
Cell::xpos
int16_t xpos
cell coordinates in 4x4 blocks
Definition: indeo3.c:78
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1838
GetBitContext
Definition: get_bits.h:108
requant_tab
static uint8_t requant_tab[8][128]
Definition: indeo3.c:115
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:508
INTRA_NULL
@ INTRA_NULL
Definition: indeo3.c:731
IV3_BAD_DATA
@ IV3_BAD_DATA
Definition: indeo3.c:338
BS_BUFFER
#define BS_BUFFER
indicates which of two frame buffers should be used
Definition: indeo3.c:64
RLE_ESC_FD
@ RLE_ESC_FD
apply null delta to all remaining lines of this block
Definition: indeo3.c:52
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
Indeo3DecodeContext::width
int16_t width
Definition: indeo3.c:98
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
av_cold
#define av_cold
Definition: attributes.h:90
RLE_ESC_FA
@ RLE_ESC_FA
INTRA: skip block, INTER: copy data from reference.
Definition: indeo3.c:49
build_requant_tab
static av_cold void build_requant_tab(void)
Definition: indeo3.c:122
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:311
intreadwrite.h
Indeo3DecodeContext::gb
GetBitContext gb
Definition: indeo3.c:90
offsets
static const int offsets[]
Definition: hevc_pel.c:34
Indeo3DecodeContext::buf_sel
uint8_t buf_sel
active frame buffer: 0 - primary, 1 -secondary
Definition: indeo3.c:103
copy_cell
static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
Copy pixels of the cell(x + mv_x, y + mv_y) from the previous frame into the cell(x,...
Definition: indeo3.c:237
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
Indeo3DecodeContext::hdsp
HpelDSPContext hdsp
Definition: indeo3.c:88
UPDATE_BITPOS
#define UPDATE_BITPOS(n)
Definition: indeo3.c:738
RLE_LINES_COPY_M10
#define RLE_LINES_COPY_M10
Definition: indeo3.c:365
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
ctx
AVFormatContext * ctx
Definition: movenc.c:49
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: indeo3.c:1056
Indeo3DecodeContext::v_data_size
int32_t v_data_size
Definition: indeo3.c:108
decode.h
get_bits.h
IV3_OUT_OF_DATA
@ IV3_OUT_OF_DATA
Definition: indeo3.c:341
BS_KEYFRAME
#define BS_KEYFRAME
intra frame indicator
Definition: indeo3.c:60
Plane::buffers
uint8_t * buffers[2]
Definition: indeo3.c:68
vqEntry
Definition: indeo3data.h:323
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:296
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:338
parse_bintree
static int parse_bintree(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, int code, Cell *ref_cell, const int depth, const int strip_width)
Definition: indeo3.c:758
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
Indeo3DecodeContext::y_data_ptr
const uint8_t * y_data_ptr
Definition: indeo3.c:104
Indeo3DecodeContext::next_cell_data
const uint8_t * next_cell_data
Definition: indeo3.c:93
RLE_ESC_FF
@ RLE_ESC_FF
apply null delta to all lines up to the 2nd line
Definition: indeo3.c:54
V_SPLIT
@ V_SPLIT
Definition: indeo3.c:730
Indeo3DecodeContext::num_vectors
unsigned num_vectors
number of motion vectors in mc_vectors
Definition: indeo3.c:96
RLE_ESC_FC
@ RLE_ESC_FC
same as RLE_ESC_FD + do the same with next block
Definition: indeo3.c:51
Indeo3DecodeContext::height
int16_t height
Definition: indeo3.c:98
Indeo3DecodeContext::u_data_ptr
const uint8_t * u_data_ptr
Definition: indeo3.c:106
Indeo3DecodeContext
Definition: indeo3.c:86
RLE_LINES_COPY
#define RLE_LINES_COPY
Definition: indeo3.c:362
Indeo3DecodeContext::last_byte
const uint8_t * last_byte
Definition: indeo3.c:94
Indeo3DecodeContext::planes
Plane planes[3]
Definition: indeo3.c:111
AVOnce
#define AVOnce
Definition: thread.h:202
SPLIT_CELL
#define SPLIT_CELL(size, new_size)
Definition: indeo3.c:736
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
HpelDSPContext
Half-pel DSP context.
Definition: hpeldsp.h:45
Cell
Definition: indeo3.c:77
Plane::pixels
uint8_t * pixels[2]
pointer to the actual pixel data of the buffers above
Definition: indeo3.c:69
Cell::width
int16_t width
cell width in 4x4 blocks
Definition: indeo3.c:80
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:220
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1697
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:540
height
#define height
Definition: dsp.h:85
codec_internal.h
Plane::height
int height
Definition: cfhd.h:119
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
Indeo3DecodeContext::cb_offset
uint8_t cb_offset
needed for selecting VQ tables
Definition: indeo3.c:102
RLE_ESC_FB
@ RLE_ESC_FB
apply null delta to N blocks / skip N blocks
Definition: indeo3.c:50
decode_plane
static int decode_plane(Indeo3DecodeContext *ctx, AVCodecContext *avctx, Plane *plane, const uint8_t *data, int32_t data_size, int32_t strip_width)
Definition: indeo3.c:859
Indeo3DecodeContext::v_data_ptr
const uint8_t * v_data_ptr
Definition: indeo3.c:105
Plane::pitch
ptrdiff_t pitch
Definition: indeo3.c:72
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
allocate_frame_buffers
static av_cold int allocate_frame_buffers(Indeo3DecodeContext *ctx, AVCodecContext *avctx, int luma_width, int luma_height)
Definition: indeo3.c:168
Plane::width
int width
Definition: cfhd.h:118
Cell::ypos
int16_t ypos
Definition: indeo3.c:79
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
line
Definition: graph2dot.c:48
indeo3data.h
Indeo3DecodeContext::avctx
AVCodecContext * avctx
Definition: indeo3.c:87
Indeo3DecodeContext::u_data_size
int32_t u_data_size
Definition: indeo3.c:109
Indeo3DecodeContext::data_size
int data_size
size of the frame data in bytes
Definition: indeo3.c:100
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
copy_block.h
FFMIN3
#define FFMIN3(a, b, c)
Definition: macros.h:50
vqEntry::num_dyads
uint8_t num_dyads
number of two-pixel deltas
Definition: indeo3data.h:326
delta
float delta
Definition: vorbis_enc_data.h:430
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
RESYNC_BITSTREAM
#define RESYNC_BITSTREAM
Definition: indeo3.c:742
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
Cell::mv_ptr
const int8_t * mv_ptr
ptr to the motion vector if any
Definition: indeo3.c:83
AVCodecContext::height
int height
Definition: avcodec.h:632
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:671
Plane::width
uint32_t width
Definition: indeo3.c:70
avcodec.h
AV_RN32A
#define AV_RN32A(p)
Definition: intreadwrite.h:522
ret
ret
Definition: filter_design.txt:187
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
Indeo3DecodeContext::frame_num
uint32_t frame_num
current frame number (zero-based)
Definition: indeo3.c:99
Indeo3DecodeContext::y_data_size
int32_t y_data_size
Definition: indeo3.c:107
replicate64
static uint64_t replicate64(uint64_t a)
Definition: indeo3.c:302
free_frame_buffers
static av_cold void free_frame_buffers(Indeo3DecodeContext *ctx)
Definition: indeo3.c:154
BS_8BIT_PEL
#define BS_8BIT_PEL
8-bit pixel bitdepth indicator
Definition: indeo3.c:59
AV_WN64A
#define AV_WN64A(p, v)
Definition: intreadwrite.h:538
Plane::height
uint32_t height
Definition: indeo3.c:71
AVCodecContext
main external API structure.
Definition: avcodec.h:451
Indeo3DecodeContext::skip_bits
int skip_bits
Definition: indeo3.c:92
CHECK_CELL
#define CHECK_CELL
Definition: indeo3.c:749
mode
mode
Definition: ebur128.h:83
APPLY_DELTA_1011_INTER
#define APPLY_DELTA_1011_INTER
Definition: indeo3.c:409
output_plane
static void output_plane(const Plane *plane, int buf_sel, uint8_t *dst, ptrdiff_t dst_pitch, int dst_height)
Convert and output the current plane.
Definition: indeo3.c:1031
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
RLE_BLOCK_COPY_8
#define RLE_BLOCK_COPY_8
Definition: indeo3.c:353
Plane
Definition: cfhd.h:117
H_SPLIT
@ H_SPLIT
Definition: indeo3.c:729
Cell::tree
uint8_t tree
tree id: 0- MC tree, 1 - VQ tree
Definition: indeo3.c:82
RLE_BLOCK_COPY
#define RLE_BLOCK_COPY
Definition: indeo3.c:349
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
replicate32
static uint32_t replicate32(uint32_t a)
Definition: indeo3.c:313
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:516
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:478
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:632
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
imgutils.h
hpeldsp.h
ff_indeo3_decoder
const FFCodec ff_indeo3_decoder
Definition: indeo3.c:1140
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
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
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
IV3_BAD_COUNTER
@ IV3_BAD_COUNTER
Definition: indeo3.c:339
h
h
Definition: vp9dsp_template.c:2070
av_image_check_size
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:318
width
#define width
Definition: dsp.h:85
Indeo3DecodeContext::need_resync
int need_resync
Definition: indeo3.c:91
RLE_ESC_FE
@ RLE_ESC_FE
apply null delta to all lines up to the 3rd line
Definition: indeo3.c:53
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:217
is_first_row
static int is_first_row(const VVCFrameContext *fc, const int rx, const int ry)
Definition: thread.c:169
Indeo3DecodeContext::frame_flags
uint16_t frame_flags
frame properties
Definition: indeo3.c:101
INTER_DATA
@ INTER_DATA
Definition: indeo3.c:732
vqEntry::quad_exp
uint8_t quad_exp
log2 of four-pixel deltas
Definition: indeo3data.h:327
src
#define src
Definition: vp8dsp.c:248
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
fill_64
static void fill_64(uint8_t *dst, const uint64_t pix, int32_t n, int32_t row_offset)
Definition: indeo3.c:326