FFmpeg
svq1dec.c
Go to the documentation of this file.
1 /*
2  * SVQ1 decoder
3  * ported to MPlayer by Arpi <arpi@thot.banki.hu>
4  * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
5  *
6  * Copyright (c) 2002 The Xine project
7  * Copyright (c) 2002 The FFmpeg project
8  *
9  * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
10  *
11  * This file is part of FFmpeg.
12  *
13  * FFmpeg is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Lesser General Public
15  * License as published by the Free Software Foundation; either
16  * version 2.1 of the License, or (at your option) any later version.
17  *
18  * FFmpeg is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  * Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public
24  * License along with FFmpeg; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26  */
27 
28 /**
29  * @file
30  * Sorenson Vector Quantizer #1 (SVQ1) video codec.
31  * For more information of the SVQ1 algorithm, visit:
32  * http://www.pcisys.net/~melanson/codecs/
33  */
34 
35 #include "libavutil/attributes.h"
36 #include "libavutil/crc.h"
37 #include "libavutil/mem.h"
38 #include "libavutil/thread.h"
39 
40 #include "avcodec.h"
41 #include "codec_internal.h"
42 #include "decode.h"
43 #include "get_bits.h"
44 #include "h263data.h"
45 #include "hpeldsp.h"
46 #include "mathops.h"
47 #include "svq1.h"
48 
49 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
52 static const VLCElem *svq1_intra_multistage[6];
53 static const VLCElem *svq1_inter_multistage[6];
55 static VLCElem svq1_inter_mean[1434];
56 
57 /* motion vector (prediction) */
58 typedef struct svq1_pmv_s {
59  int x;
60  int y;
61 } svq1_pmv;
62 
63 typedef struct SVQ1Context {
67 
68  uint8_t *pkt_swapped;
70 
71  svq1_pmv *pmv;
73 
74  int width;
75  int height;
77  int nonref; // 1 if the current frame won't be referenced
78 
80 } SVQ1Context;
81 
82 static const uint8_t string_table[256] = {
83  0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
84  0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
85  0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
86  0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
87  0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
88  0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
89  0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
90  0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
91  0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
92  0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
93  0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
94  0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
95  0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
96  0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
97  0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
98  0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
99  0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
100  0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
101  0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
102  0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
103  0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
104  0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
105  0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
106  0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
107  0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
108  0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
109  0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
110  0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
111  0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
112  0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
113  0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
114  0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
115 };
116 
117 #define SVQ1_PROCESS_VECTOR() \
118  for (; level > 0; i++) { \
119  /* process next depth */ \
120  if (i == m) { \
121  m = n; \
122  if (--level == 0) \
123  break; \
124  } \
125  /* divide block if next bit set */ \
126  if (!get_bits1(bitbuf)) \
127  break; \
128  /* add child nodes */ \
129  list[n++] = list[i]; \
130  list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
131  }
132 
133 #define SVQ1_ADD_CODEBOOK() \
134  /* add codebook entries to vector */ \
135  for (j = 0; j < stages; j++) { \
136  n3 = codebook[entries[j]] ^ 0x80808080; \
137  n1 += (n3 & 0xFF00FF00) >> 8; \
138  n2 += n3 & 0x00FF00FF; \
139  } \
140  \
141  /* clip to [0..255] */ \
142  if (n1 & 0xFF00FF00) { \
143  n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
144  n1 += 0x7F007F00; \
145  n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
146  n1 &= n3 & 0x00FF00FF; \
147  } \
148  \
149  if (n2 & 0xFF00FF00) { \
150  n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
151  n2 += 0x7F007F00; \
152  n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
153  n2 &= n3 & 0x00FF00FF; \
154  }
155 
156 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
157  codebook = (const uint32_t *)cbook[level]; \
158  if (stages > 0) \
159  bit_cache = get_bits(bitbuf, 4 * stages); \
160  /* calculate codebook entries for this vector */ \
161  for (j = 0; j < stages; j++) { \
162  entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
163  16 * j) << (level + 1); \
164  } \
165  mean -= stages * 128; \
166  n4 = (mean << 16) + mean;
167 
168 static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels,
169  ptrdiff_t pitch)
170 {
171  uint32_t bit_cache;
172  uint8_t *list[63];
173  uint32_t *dst;
174  const uint32_t *codebook;
175  int entries[6];
176  int i, j, m, n;
177  int stages;
178  unsigned mean;
179  unsigned x, y, width, height, level;
180  uint32_t n1, n2, n3, n4;
181 
182  /* initialize list for breadth first processing of vectors */
183  list[0] = pixels;
184 
185  /* recursively process vector */
186  for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
188 
189  /* destination address and vector size */
190  dst = (uint32_t *)list[i];
191  width = 1 << ((4 + level) / 2);
192  height = 1 << ((3 + level) / 2);
193 
194  /* get number of stages (-1 skips vector, 0 for mean only) */
195  stages = get_vlc2(bitbuf, svq1_intra_multistage[level], 4, 2) - 1;
196 
197  if (stages == -1) {
198  for (y = 0; y < height; y++)
199  memset(&dst[y * (pitch / 4)], 0, width);
200  continue; /* skip vector */
201  }
202 
203  if ((stages > 0 && level >= 4)) {
204  ff_dlog(NULL,
205  "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
206  stages, level);
207  return AVERROR_INVALIDDATA; /* invalid vector */
208  }
209  av_assert0(stages >= 0);
210 
211  mean = get_vlc2(bitbuf, svq1_intra_mean, 8, 3);
212 
213  if (stages == 0) {
214  for (y = 0; y < height; y++)
215  memset(&dst[y * (pitch / 4)], mean, width);
216  } else {
218 
219  for (y = 0; y < height; y++) {
220  for (x = 0; x < width / 4; x++, codebook++) {
221  n1 = n4;
222  n2 = n4;
224  /* store result */
225  dst[x] = n1 << 8 | n2;
226  }
227  dst += pitch / 4;
228  }
229  }
230  }
231 
232  return 0;
233 }
234 
235 static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels,
236  ptrdiff_t pitch, int buggy)
237 {
238  uint32_t bit_cache;
239  uint8_t *list[63];
240  uint32_t *dst;
241  const uint32_t *codebook;
242  int entries[6];
243  int i, j, m, n;
244  int stages;
245  unsigned mean;
246  int x, y, width, height, level;
247  uint32_t n1, n2, n3, n4;
248 
249  /* initialize list for breadth first processing of vectors */
250  list[0] = pixels;
251 
252  /* recursively process vector */
253  for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
255 
256  /* destination address and vector size */
257  dst = (uint32_t *)list[i];
258  width = 1 << ((4 + level) / 2);
259  height = 1 << ((3 + level) / 2);
260 
261  /* get number of stages (-1 skips vector, 0 for mean only) */
262  stages = get_vlc2(bitbuf, svq1_inter_multistage[level], 3, 2) - 1;
263 
264  if (stages == -1)
265  continue; /* skip vector */
266 
267  if ((stages > 0 && level >= 4)) {
268  ff_dlog(NULL,
269  "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
270  stages, level);
271  return AVERROR_INVALIDDATA; /* invalid vector */
272  }
273  av_assert0(stages >= 0);
274 
275  mean = get_vlc2(bitbuf, svq1_inter_mean, 9, 3) - 256;
276 
277  if (buggy) {
278  if (mean == -128)
279  mean = 128;
280  else if (mean == 128)
281  mean = -128;
282  }
283 
285 
286  for (y = 0; y < height; y++) {
287  for (x = 0; x < width / 4; x++) {
288  n3 = dst[x];
289  /* add mean value to vector */
290  n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
291  n2 = n4 + (n3 & 0x00FF00FF);
293  /* store result */
294  dst[x] = n1 << 8 | n2;
295  if (codebook != NULL)
296  codebook++;
297  }
298  dst += pitch / 4;
299  }
300  }
301  return 0;
302 }
303 
304 static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv,
305  svq1_pmv **pmv)
306 {
307  int diff;
308  int i;
309 
310  for (i = 0; i < 2; i++) {
311  /* get motion code */
312  diff = get_vlc2(bitbuf, svq1_motion_component, 7, 2);
313  if (diff < 0)
314  return AVERROR_INVALIDDATA;
315  else if (diff) {
316  if (get_bits1(bitbuf))
317  diff = -diff;
318  }
319 
320  /* add median of motion vector predictors and clip result */
321  if (i == 1)
322  mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6);
323  else
324  mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6);
325  }
326 
327  return 0;
328 }
329 
330 static void svq1_skip_block(uint8_t *current, uint8_t *previous,
331  ptrdiff_t pitch, int x, int y)
332 {
333  uint8_t *src;
334  uint8_t *dst;
335  int i;
336 
337  src = &previous[x + y * pitch];
338  dst = current;
339 
340  for (i = 0; i < 16; i++) {
341  memcpy(dst, src, 16);
342  src += pitch;
343  dst += pitch;
344  }
345 }
346 
348  uint8_t *current, uint8_t *previous,
349  ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
350  int width, int height)
351 {
352  uint8_t *src;
353  uint8_t *dst;
354  svq1_pmv mv;
355  svq1_pmv *pmv[3];
356  int result;
357 
358  /* predict and decode motion vector */
359  pmv[0] = &motion[0];
360  if (y == 0) {
361  pmv[1] =
362  pmv[2] = pmv[0];
363  } else {
364  pmv[1] = &motion[x / 8 + 2];
365  pmv[2] = &motion[x / 8 + 4];
366  }
367 
368  result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
369  if (result)
370  return result;
371 
372  motion[0].x =
373  motion[x / 8 + 2].x =
374  motion[x / 8 + 3].x = mv.x;
375  motion[0].y =
376  motion[x / 8 + 2].y =
377  motion[x / 8 + 3].y = mv.y;
378 
379  mv.x = av_clip(mv.x, -2 * x, 2 * (width - x - 16));
380  mv.y = av_clip(mv.y, -2 * y, 2 * (height - y - 16));
381 
382  src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch];
383  dst = current;
384 
385  hdsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16);
386 
387  return 0;
388 }
389 
391  uint8_t *current, uint8_t *previous,
392  ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
393  int width, int height)
394 {
395  uint8_t *src;
396  uint8_t *dst;
397  svq1_pmv mv;
398  svq1_pmv *pmv[4];
399  int i, result;
400 
401  /* predict and decode motion vector (0) */
402  pmv[0] = &motion[0];
403  if (y == 0) {
404  pmv[1] =
405  pmv[2] = pmv[0];
406  } else {
407  pmv[1] = &motion[(x / 8) + 2];
408  pmv[2] = &motion[(x / 8) + 4];
409  }
410 
411  result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
412  if (result)
413  return result;
414 
415  /* predict and decode motion vector (1) */
416  pmv[0] = &mv;
417  if (y == 0) {
418  pmv[1] =
419  pmv[2] = pmv[0];
420  } else {
421  pmv[1] = &motion[(x / 8) + 3];
422  }
423  result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv);
424  if (result)
425  return result;
426 
427  /* predict and decode motion vector (2) */
428  pmv[1] = &motion[0];
429  pmv[2] = &motion[(x / 8) + 1];
430 
431  result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv);
432  if (result)
433  return result;
434 
435  /* predict and decode motion vector (3) */
436  pmv[2] = &motion[(x / 8) + 2];
437  pmv[3] = &motion[(x / 8) + 3];
438 
439  result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv);
440  if (result)
441  return result;
442 
443  /* form predictions */
444  for (i = 0; i < 4; i++) {
445  int mvx = pmv[i]->x + (i & 1) * 16;
446  int mvy = pmv[i]->y + (i >> 1) * 16;
447 
448  // FIXME: clipping or padding?
449  mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
450  mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
451 
452  src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
453  dst = current;
454 
455  hdsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
456 
457  /* select next block */
458  if (i & 1)
459  current += 8 * (pitch - 1);
460  else
461  current += 8;
462  }
463 
464  return 0;
465 }
466 
468  GetBitContext *bitbuf,
469  uint8_t *current, uint8_t *previous,
470  ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
471  int width, int height, int buggy)
472 {
473  uint32_t block_type;
474  int result = 0;
475 
476  /* get block type */
477  block_type = get_vlc2(bitbuf, svq1_block_type,
479 
480  /* reset motion vectors */
481  if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
482  motion[0].x =
483  motion[0].y =
484  motion[x / 8 + 2].x =
485  motion[x / 8 + 2].y =
486  motion[x / 8 + 3].x =
487  motion[x / 8 + 3].y = 0;
488  }
489 
490  switch (block_type) {
491  case SVQ1_BLOCK_SKIP:
492  svq1_skip_block(current, previous, pitch, x, y);
493  break;
494 
495  case SVQ1_BLOCK_INTER:
496  result = svq1_motion_inter_block(hdsp, bitbuf, current, previous,
497  pitch, motion, x, y, width, height);
498 
499  if (result != 0) {
500  ff_dlog(avctx, "Error in svq1_motion_inter_block %i\n", result);
501  break;
502  }
503  result = svq1_decode_block_non_intra(bitbuf, current, pitch, buggy);
504  break;
505 
506  case SVQ1_BLOCK_INTER_4V:
507  result = svq1_motion_inter_4v_block(hdsp, bitbuf, current, previous,
508  pitch, motion, x, y, width, height);
509 
510  if (result != 0) {
511  ff_dlog(avctx, "Error in svq1_motion_inter_4v_block %i\n", result);
512  break;
513  }
514  result = svq1_decode_block_non_intra(bitbuf, current, pitch, buggy);
515  break;
516 
517  case SVQ1_BLOCK_INTRA:
518  result = svq1_decode_block_intra(bitbuf, current, pitch);
519  break;
520  }
521 
522  return result;
523 }
524 
525 static void svq1_parse_string(GetBitContext *bitbuf, uint8_t out[257])
526 {
527  uint8_t seed;
528  int i;
529 
530  out[0] = get_bits(bitbuf, 8);
531  seed = string_table[out[0]];
532 
533  for (i = 1; i <= out[0]; i++) {
534  out[i] = get_bits(bitbuf, 8) ^ seed;
535  seed = string_table[out[i] ^ seed];
536  }
537  out[i] = 0;
538 }
539 
540 static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame, int * buggy)
541 {
542  SVQ1Context *s = avctx->priv_data;
543  GetBitContext *bitbuf = &s->gb;
544  int frame_size_code;
545  int width = s->width;
546  int height = s->height;
547  int tempref;
548 
549  tempref = get_bits(bitbuf, 8); /* temporal_reference */
550  *buggy = tempref == 0 && s->last_tempref == 0 && avctx->extradata_size == 0;
551  s->last_tempref = tempref;
552 
553  /* frame type */
554  s->nonref = 0;
555  switch (get_bits(bitbuf, 2)) {
556  case 0:
557  frame->pict_type = AV_PICTURE_TYPE_I;
558  break;
559  case 2:
560  s->nonref = 1;
561  case 1:
562  frame->pict_type = AV_PICTURE_TYPE_P;
563  break;
564  default:
565  av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
566  return AVERROR_INVALIDDATA;
567  }
568 
569  if (frame->pict_type == AV_PICTURE_TYPE_I) {
570  /* unknown fields */
571  if (s->frame_code == 0x50 || s->frame_code == 0x60) {
572  int csum = get_bits(bitbuf, 16);
573 
574  csum = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), av_bswap16(csum), bitbuf->buffer, bitbuf->size_in_bits >> 3));
575 
576  ff_dlog(avctx, "%s checksum (%02x) for packet data\n",
577  (csum == 0) ? "correct" : "incorrect", csum);
578  }
579 
580  if ((s->frame_code ^ 0x10) >= 0x50) {
581  uint8_t msg[257];
582 
583  svq1_parse_string(bitbuf, msg);
584 
585  av_log(avctx, AV_LOG_INFO,
586  "embedded message:\n%s\n", ((char *)msg) + 1);
587  }
588 
589  skip_bits(bitbuf, 2);
590  skip_bits(bitbuf, 2);
591  skip_bits1(bitbuf);
592 
593  /* load frame size */
594  frame_size_code = get_bits(bitbuf, 3);
595 
596  if (frame_size_code == 7) {
597  /* load width, height (12 bits each) */
598  width = get_bits(bitbuf, 12);
599  height = get_bits(bitbuf, 12);
600 
601  if (!width || !height)
602  return AVERROR_INVALIDDATA;
603  } else {
604  /* get width, height from table */
605  width = ff_svq1_frame_size_table[frame_size_code][0];
606  height = ff_svq1_frame_size_table[frame_size_code][1];
607  }
608  }
609 
610  /* unknown fields */
611  if (get_bits1(bitbuf)) {
612  skip_bits1(bitbuf); /* use packet checksum if (1) */
613  skip_bits1(bitbuf); /* component checksums after image data if (1) */
614 
615  if (get_bits(bitbuf, 2) != 0)
616  return AVERROR_INVALIDDATA;
617  }
618 
619  if (get_bits1(bitbuf)) {
620  skip_bits1(bitbuf);
621  skip_bits(bitbuf, 4);
622  skip_bits1(bitbuf);
623  skip_bits(bitbuf, 2);
624 
625  if (skip_1stop_8data_bits(bitbuf) < 0)
626  return AVERROR_INVALIDDATA;
627  }
628  if (get_bits_left(bitbuf) <= 0)
629  return AVERROR_INVALIDDATA;
630 
631  s->width = width;
632  s->height = height;
633  return 0;
634 }
635 
636 static int svq1_decode_frame(AVCodecContext *avctx, AVFrame *cur,
637  int *got_frame, AVPacket *avpkt)
638 {
639  const uint8_t *buf = avpkt->data;
640  int buf_size = avpkt->size;
641  SVQ1Context *s = avctx->priv_data;
642  uint8_t *current;
643  int result, i, x, y, width, height, buggy;
644  int ret;
645 
646  /* initialize bit buffer */
647  ret = init_get_bits8(&s->gb, buf, buf_size);
648  if (ret < 0)
649  return ret;
650 
651  /* decode frame header */
652  s->frame_code = get_bits(&s->gb, 22);
653 
654  if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
655  return AVERROR_INVALIDDATA;
656 
657  /* swap some header bytes (why?) */
658  if (s->frame_code != 0x20) {
659  uint32_t *src;
660 
661  if (buf_size < 9 * 4) {
662  av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
663  return AVERROR_INVALIDDATA;
664  }
665 
666  av_fast_padded_malloc(&s->pkt_swapped,
667  &s->pkt_swapped_allocated,
668  buf_size);
669  if (!s->pkt_swapped)
670  return AVERROR(ENOMEM);
671 
672  memcpy(s->pkt_swapped, buf, buf_size);
673  buf = s->pkt_swapped;
674  init_get_bits(&s->gb, buf, buf_size * 8);
675  skip_bits(&s->gb, 22);
676 
677  src = (uint32_t *)(s->pkt_swapped + 4);
678 
679  for (i = 0; i < 4; i++)
680  src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
681  }
682 
683  result = svq1_decode_frame_header(avctx, cur, &buggy);
684  if (result != 0) {
685  ff_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
686  return result;
687  }
688 
689  result = ff_set_dimensions(avctx, s->width, s->height);
690  if (result < 0)
691  return result;
692 
693  if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
694  (avctx->skip_frame >= AVDISCARD_NONKEY &&
695  cur->pict_type != AV_PICTURE_TYPE_I) ||
696  avctx->skip_frame >= AVDISCARD_ALL)
697  return buf_size;
698 
699  result = ff_get_buffer(avctx, cur, s->nonref ? 0 : AV_GET_BUFFER_FLAG_REF);
700  if (result < 0)
701  return result;
702 
703  av_fast_padded_malloc(&s->pmv, &s->pmv_allocated, (FFALIGN(s->width, 16) / 8 + 3) * sizeof(*s->pmv));
704  if (!s->pmv)
705  return AVERROR(ENOMEM);
706 
707  /* decode y, u and v components */
708  for (i = 0; i < 3; i++) {
709  int linesize = cur->linesize[i];
710  if (i == 0) {
711  width = FFALIGN(s->width, 16);
712  height = FFALIGN(s->height, 16);
713  } else {
714  if (avctx->flags & AV_CODEC_FLAG_GRAY)
715  break;
716  width = FFALIGN(s->width / 4, 16);
717  height = FFALIGN(s->height / 4, 16);
718  }
719 
720  current = cur->data[i];
721 
722  if (cur->pict_type == AV_PICTURE_TYPE_I) {
723  /* keyframe */
724  for (y = 0; y < height; y += 16) {
725  for (x = 0; x < width; x += 16) {
726  result = svq1_decode_block_intra(&s->gb, &current[x],
727  linesize);
728  if (result) {
729  av_log(avctx, AV_LOG_ERROR,
730  "Error in svq1_decode_block %i (keyframe)\n",
731  result);
732  return result;
733  }
734  }
735  current += 16 * linesize;
736  }
737  } else {
738  /* delta frame */
739  uint8_t *previous = s->prev->data[i];
740  if (!previous ||
741  s->prev->width != s->width || s->prev->height != s->height) {
742  av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
743  return AVERROR_INVALIDDATA;
744  }
745 
746  memset(s->pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
747 
748  for (y = 0; y < height; y += 16) {
749  for (x = 0; x < width; x += 16) {
750  result = svq1_decode_delta_block(avctx, &s->hdsp,
751  &s->gb, &current[x],
752  previous, linesize,
753  s->pmv, x, y, width, height, buggy);
754  if (result != 0) {
755  ff_dlog(avctx,
756  "Error in svq1_decode_delta_block %i\n",
757  result);
758  return result;
759  }
760  }
761 
762  s->pmv[0].x =
763  s->pmv[0].y = 0;
764 
765  current += 16 * linesize;
766  }
767  }
768  }
769 
770  if (!s->nonref) {
771  result = av_frame_replace(s->prev, cur);
772  if (result < 0)
773  return result;
774  }
775 
776  *got_frame = 1;
777  result = buf_size;
778 
779  return result;
780 }
781 
782 static av_cold void svq1_static_init(void)
783 {
784  static VLCElem table[196];
786 
788  &ff_svq1_block_type_vlc[0][1], 2, 1,
789  &ff_svq1_block_type_vlc[0][0], 2, 1, 0);
790 
792  &ff_mvtab[0][1], 2, 1,
793  &ff_mvtab[0][0], 2, 1, 0);
794 
795  for (int i = 0; i < 6; i++) {
797  ff_vlc_init_tables(&state, 4, 8,
798  &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
799  &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 0);
801  ff_vlc_init_tables(&state, 3, 8,
802  &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
803  &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 0);
804  }
805 
807  &ff_svq1_intra_mean_vlc[0][1], 4, 2,
808  &ff_svq1_intra_mean_vlc[0][0], 4, 2, 0);
809 
811  &ff_svq1_inter_mean_vlc[0][1], 4, 2,
812  &ff_svq1_inter_mean_vlc[0][0], 4, 2, 0);
813 }
814 
816 {
817  static AVOnce init_static_once = AV_ONCE_INIT;
818  SVQ1Context *s = avctx->priv_data;
819 
820  s->prev = av_frame_alloc();
821  if (!s->prev)
822  return AVERROR(ENOMEM);
823 
824  s->width = avctx->width + 3 & ~3;
825  s->height = avctx->height + 3 & ~3;
826  avctx->pix_fmt = AV_PIX_FMT_YUV410P;
827 
828  ff_hpeldsp_init(&s->hdsp, avctx->flags);
829 
830  ff_thread_once(&init_static_once, svq1_static_init);
831 
832  s->last_tempref = 0xFF;
833 
834  return 0;
835 }
836 
838 {
839  SVQ1Context *s = avctx->priv_data;
840 
841  av_frame_free(&s->prev);
842  av_freep(&s->pkt_swapped);
843  s->pkt_swapped_allocated = 0;
844  av_freep(&s->pmv);
845  s->pmv_allocated = 0;
846 
847  return 0;
848 }
849 
850 static av_cold void svq1_flush(AVCodecContext *avctx)
851 {
852  SVQ1Context *s = avctx->priv_data;
853 
854  av_frame_unref(s->prev);
855 }
856 
858  .p.name = "svq1",
859  CODEC_LONG_NAME("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
860  .p.type = AVMEDIA_TYPE_VIDEO,
861  .p.id = AV_CODEC_ID_SVQ1,
862  .priv_data_size = sizeof(SVQ1Context),
866  .p.capabilities = AV_CODEC_CAP_DR1,
867  .flush = svq1_flush,
868 };
h263data.h
level
uint8_t level
Definition: svq3.c:208
av_clip
#define av_clip
Definition: common.h:100
svq1_static_init
static av_cold void svq1_static_init(void)
Definition: svq1dec.c:782
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:689
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
out
FILE * out
Definition: movenc.c:55
svq1_block_type
static VLCElem svq1_block_type[8]
Definition: svq1dec.c:50
svq1_decode_block_non_intra
static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch, int buggy)
Definition: svq1dec.c:235
thread.h
ff_svq1_inter_codebooks
const FF_VISIBILITY_PUSH_HIDDEN int8_t *const ff_svq1_inter_codebooks[6]
Definition: svq1_cb.h:776
SVQ1Context::last_tempref
int last_tempref
Definition: svq1dec.c:79
SVQ1Context::height
int height
Definition: svq1dec.c:75
mv
static const int8_t mv[256][2]
Definition: 4xm.c:81
ff_svq1_intra_codebooks
const int8_t *const ff_svq1_intra_codebooks[6]
Definition: svq1_cb.h:1519
GetBitContext::size_in_bits
int size_in_bits
Definition: get_bits.h:112
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
svq1_inter_multistage
static const VLCElem * svq1_inter_multistage[6]
Definition: svq1dec.c:53
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
AVPacket::data
uint8_t * data
Definition: packet.h:558
table
static const uint16_t table[]
Definition: prosumer.c:203
FFCodec
Definition: codec_internal.h:127
svq1_skip_block
static void svq1_skip_block(uint8_t *current, uint8_t *previous, ptrdiff_t pitch, int x, int y)
Definition: svq1dec.c:330
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
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:512
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:448
ff_svq1_intra_multistage_vlc
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:33
crc.h
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:379
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:333
ff_svq1_inter_mean_vlc
const uint16_t ff_svq1_inter_mean_vlc[512][2]
Definition: svq1_vlc.h:136
svq1_decode_block_intra
static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch)
Definition: svq1dec.c:168
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
SVQ1_CALC_CODEBOOK_ENTRIES
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)
Definition: svq1dec.c:156
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1662
GetBitContext
Definition: get_bits.h:109
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
svq1_decode_end
static av_cold int svq1_decode_end(AVCodecContext *avctx)
Definition: svq1dec.c:837
svq1_pmv_s::x
int x
Definition: svq1dec.c:59
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
SVQ1_BLOCK_TYPE_VLC_BITS
#define SVQ1_BLOCK_TYPE_VLC_BITS
Definition: svq1dec.c:49
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
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:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:539
SVQ1Context::hdsp
HpelDSPContext hdsp
Definition: svq1dec.c:64
VLCInitState
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
Definition: vlc.h:220
svq1_decode_frame
static int svq1_decode_frame(AVCodecContext *avctx, AVFrame *cur, int *got_frame, AVPacket *avpkt)
Definition: svq1dec.c:636
SVQ1Context::gb
GetBitContext gb
Definition: svq1dec.c:65
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:515
svq1_inter_mean
static VLCElem svq1_inter_mean[1434]
Definition: svq1dec.c:55
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:346
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
decode.h
get_bits.h
SVQ1Context
Definition: svq1dec.c:63
SVQ1Context::pmv
svq1_pmv * pmv
Definition: svq1dec.c:71
svq1_motion_inter_block
static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height)
Definition: svq1dec.c:347
SVQ1Context::frame_code
int frame_code
Definition: svq1dec.c:76
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:331
ff_hpeldsp_init
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:337
SVQ1_ADD_CODEBOOK
#define SVQ1_ADD_CODEBOOK()
Definition: svq1dec.c:133
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
GetBitContext::buffer
const uint8_t * buffer
Definition: get_bits.h:110
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
NULL
#define NULL
Definition: coverity.c:32
SVQ1_BLOCK_INTRA
#define SVQ1_BLOCK_INTRA
Definition: svq1.h:45
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:386
mathops.h
list
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 list
Definition: filter_design.txt:25
SVQ1_BLOCK_SKIP
#define SVQ1_BLOCK_SKIP
Definition: svq1.h:42
seed
static unsigned int seed
Definition: videogen.c:78
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:646
AVOnce
#define AVOnce
Definition: thread.h:202
svq1_flush
static av_cold void svq1_flush(AVCodecContext *avctx)
Definition: svq1dec.c:850
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
HpelDSPContext
Half-pel DSP context.
Definition: hpeldsp.h:45
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:231
HpelDSPContext::put_pixels_tab
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
Definition: hpeldsp.h:56
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1720
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:519
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:302
AVPacket::size
int size
Definition: packet.h:559
height
#define height
Definition: dsp.h:89
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
VLCElem
Definition: vlc.h:32
SVQ1_BLOCK_INTER_4V
#define SVQ1_BLOCK_INTER_4V
Definition: svq1.h:44
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
state
static struct @526 state
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
attributes.h
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:411
AV_CODEC_ID_SVQ1
@ AV_CODEC_ID_SVQ1
Definition: codec_id.h:74
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AV_CRC_16_CCITT
@ AV_CRC_16_CCITT
Definition: crc.h:51
string_table
static const uint8_t string_table[256]
Definition: svq1dec.c:82
av_fast_padded_malloc
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition: utils.c:53
svq1_decode_frame_header
static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame, int *buggy)
Definition: svq1dec.c:540
SVQ1_PROCESS_VECTOR
#define SVQ1_PROCESS_VECTOR()
Definition: svq1dec.c:117
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
SVQ1Context::nonref
int nonref
Definition: svq1dec.c:77
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
AVCodecContext::height
int height
Definition: avcodec.h:592
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
SVQ1_BLOCK_INTER
#define SVQ1_BLOCK_INTER
Definition: svq1.h:43
avcodec.h
svq1_parse_string
static void svq1_parse_string(GetBitContext *bitbuf, uint8_t out[257])
Definition: svq1dec.c:525
svq1_intra_mean
static VLCElem svq1_intra_mean[632]
Definition: svq1dec.c:54
ff_svq1_inter_multistage_vlc
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:50
mid_pred
#define mid_pred
Definition: mathops.h:97
SVQ1Context::prev
AVFrame * prev
Definition: svq1dec.c:66
ret
ret
Definition: filter_design.txt:187
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
svq1_decode_delta_block
static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height, int buggy)
Definition: svq1dec.c:467
ff_mvtab
const uint8_t ff_mvtab[33][2]
Definition: h263data.c:88
av_frame_replace
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
Definition: frame.c:376
skip_1stop_8data_bits
static int skip_1stop_8data_bits(GetBitContext *gb)
Definition: get_bits.h:694
AVCodecContext
main external API structure.
Definition: avcodec.h:431
svq1_decode_motion_vector
static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv)
Definition: svq1dec.c:304
ff_svq1_block_type_vlc
const uint8_t ff_svq1_block_type_vlc[4][2]
Definition: svq1_vlc.h:27
ff_svq1_intra_mean_vlc
const uint16_t ff_svq1_intra_mean_vlc[256][2]
Definition: svq1_vlc.h:67
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
VLC_INIT_STATIC_TABLE
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:278
SVQ1Context::width
int width
Definition: svq1dec.c:74
SVQ1Context::pkt_swapped_allocated
int pkt_swapped_allocated
Definition: svq1dec.c:69
svq1.h
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:132
mean
static float mean(const float *input, int size)
Definition: vf_nnedi.c:861
svq1_decode_init
static av_cold int svq1_decode_init(AVCodecContext *avctx)
Definition: svq1dec.c:815
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ff_vlc_init_tables
static const VLCElem * ff_vlc_init_tables(VLCInitState *state, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, int flags)
Definition: vlc.h:254
mem.h
SVQ1Context::pmv_allocated
int pmv_allocated
Definition: svq1dec.c:72
svq1_motion_component
static VLCElem svq1_motion_component[176]
Definition: svq1dec.c:51
SVQ1Context::pkt_swapped
uint8_t * pkt_swapped
Definition: svq1dec.c:68
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
VLC_INIT_STATE
#define VLC_INIT_STATE(_table)
Definition: vlc.h:225
AVPacket
This structure stores compressed data.
Definition: packet.h:535
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
svq1_motion_inter_4v_block
static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height)
Definition: svq1dec.c:390
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
hpeldsp.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:472
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
width
#define width
Definition: dsp.h:89
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:228
svq1_pmv_s::y
int y
Definition: svq1dec.c:60
av_bswap16
#define av_bswap16
Definition: bswap.h:28
ff_svq1_frame_size_table
const uint16_t ff_svq1_frame_size_table[7][2]
Definition: svq1.c:40
ff_svq1_decoder
const FFCodec ff_svq1_decoder
Definition: svq1dec.c:857
src
#define src
Definition: vp8dsp.c:248
codebook
static const unsigned codebook[256][2]
Definition: cfhdenc.c:41
svq1_intra_multistage
static const VLCElem * svq1_intra_multistage[6]
Definition: svq1dec.c:52
svq1_pmv_s
Definition: svq1dec.c:58