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