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