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 "avcodec.h"
36 #include "get_bits.h"
37 #include "hpeldsp.h"
38 #include "internal.h"
39 #include "mathops.h"
40 #include "svq1.h"
41 
42 #undef NDEBUG
43 #include <assert.h>
44 
45 extern const uint8_t ff_mvtab[33][2];
46 
53 
54 /* motion vector (prediction) */
55 typedef struct svq1_pmv_s {
56  int x;
57  int y;
58 } svq1_pmv;
59 
60 typedef struct SVQ1Context {
64  int width;
65  int height;
67  int nonref; // 1 if the current frame won't be referenced
68 } SVQ1Context;
69 
70 static const uint8_t string_table[256] = {
71  0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
72  0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
73  0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
74  0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
75  0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
76  0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
77  0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
78  0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
79  0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
80  0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
81  0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
82  0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
83  0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
84  0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
85  0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
86  0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
87  0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
88  0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
89  0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
90  0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
91  0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
92  0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
93  0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
94  0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
95  0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
96  0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
97  0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
98  0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
99  0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
100  0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
101  0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
102  0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
103 };
104 
105 #define SVQ1_PROCESS_VECTOR() \
106  for (; level > 0; i++) { \
107  /* process next depth */ \
108  if (i == m) { \
109  m = n; \
110  if (--level == 0) \
111  break; \
112  } \
113  /* divide block if next bit set */ \
114  if (!get_bits1(bitbuf)) \
115  break; \
116  /* add child nodes */ \
117  list[n++] = list[i]; \
118  list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
119  }
120 
121 #define SVQ1_ADD_CODEBOOK() \
122  /* add codebook entries to vector */ \
123  for (j = 0; j < stages; j++) { \
124  n3 = codebook[entries[j]] ^ 0x80808080; \
125  n1 += (n3 & 0xFF00FF00) >> 8; \
126  n2 += n3 & 0x00FF00FF; \
127  } \
128  \
129  /* clip to [0..255] */ \
130  if (n1 & 0xFF00FF00) { \
131  n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
132  n1 += 0x7F007F00; \
133  n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
134  n1 &= n3 & 0x00FF00FF; \
135  } \
136  \
137  if (n2 & 0xFF00FF00) { \
138  n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
139  n2 += 0x7F007F00; \
140  n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
141  n2 &= n3 & 0x00FF00FF; \
142  }
143 
144 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
145  codebook = (const uint32_t *)cbook[level]; \
146  if (stages > 0) \
147  bit_cache = get_bits(bitbuf, 4 * stages); \
148  /* calculate codebook entries for this vector */ \
149  for (j = 0; j < stages; j++) { \
150  entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
151  16 * j) << (level + 1); \
152  } \
153  mean -= stages * 128; \
154  n4 = (mean << 16) + mean;
155 
156 static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels,
157  int pitch)
158 {
159  uint32_t bit_cache;
160  uint8_t *list[63];
161  uint32_t *dst;
162  const uint32_t *codebook;
163  int entries[6];
164  int i, j, m, n;
165  int mean, stages;
166  unsigned x, y, width, height, level;
167  uint32_t n1, n2, n3, n4;
168 
169  /* initialize list for breadth first processing of vectors */
170  list[0] = pixels;
171 
172  /* recursively process vector */
173  for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
175 
176  /* destination address and vector size */
177  dst = (uint32_t *)list[i];
178  width = 1 << ((4 + level) / 2);
179  height = 1 << ((3 + level) / 2);
180 
181  /* get number of stages (-1 skips vector, 0 for mean only) */
182  stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
183 
184  if (stages == -1) {
185  for (y = 0; y < height; y++)
186  memset(&dst[y * (pitch / 4)], 0, width);
187  continue; /* skip vector */
188  }
189 
190  if (stages > 0 && level >= 4) {
191  av_dlog(NULL,
192  "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
193  stages, level);
194  return AVERROR_INVALIDDATA; /* invalid vector */
195  }
196 
197  mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
198 
199  if (stages == 0) {
200  for (y = 0; y < height; y++)
201  memset(&dst[y * (pitch / 4)], mean, width);
202  } else {
204 
205  for (y = 0; y < height; y++) {
206  for (x = 0; x < width / 4; x++, codebook++) {
207  n1 = n4;
208  n2 = n4;
210  /* store result */
211  dst[x] = n1 << 8 | n2;
212  }
213  dst += pitch / 4;
214  }
215  }
216  }
217 
218  return 0;
219 }
220 
222  int pitch)
223 {
224  uint32_t bit_cache;
225  uint8_t *list[63];
226  uint32_t *dst;
227  const uint32_t *codebook;
228  int entries[6];
229  int i, j, m, n;
230  int mean, stages;
231  int x, y, width, height, level;
232  uint32_t n1, n2, n3, n4;
233 
234  /* initialize list for breadth first processing of vectors */
235  list[0] = pixels;
236 
237  /* recursively process vector */
238  for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
240 
241  /* destination address and vector size */
242  dst = (uint32_t *)list[i];
243  width = 1 << ((4 + level) / 2);
244  height = 1 << ((3 + level) / 2);
245 
246  /* get number of stages (-1 skips vector, 0 for mean only) */
247  stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
248 
249  if (stages == -1)
250  continue; /* skip vector */
251 
252  if ((stages > 0) && (level >= 4)) {
253  av_dlog(NULL,
254  "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
255  stages, level);
256  return AVERROR_INVALIDDATA; /* invalid vector */
257  }
258 
259  mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
260 
262 
263  for (y = 0; y < height; y++) {
264  for (x = 0; x < width / 4; x++, codebook++) {
265  n3 = dst[x];
266  /* add mean value to vector */
267  n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
268  n2 = n4 + (n3 & 0x00FF00FF);
270  /* store result */
271  dst[x] = n1 << 8 | n2;
272  }
273  dst += pitch / 4;
274  }
275  }
276  return 0;
277 }
278 
280  svq1_pmv **pmv)
281 {
282  int diff;
283  int i;
284 
285  for (i = 0; i < 2; i++) {
286  /* get motion code */
287  diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
288  if (diff < 0)
289  return AVERROR_INVALIDDATA;
290  else if (diff) {
291  if (get_bits1(bitbuf))
292  diff = -diff;
293  }
294 
295  /* add median of motion vector predictors and clip result */
296  if (i == 1)
297  mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6);
298  else
299  mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6);
300  }
301 
302  return 0;
303 }
304 
305 static void svq1_skip_block(uint8_t *current, uint8_t *previous,
306  int pitch, int x, int y)
307 {
308  uint8_t *src;
309  uint8_t *dst;
310  int i;
311 
312  src = &previous[x + y * pitch];
313  dst = current;
314 
315  for (i = 0; i < 16; i++) {
316  memcpy(dst, src, 16);
317  src += pitch;
318  dst += pitch;
319  }
320 }
321 
323  uint8_t *current, uint8_t *previous,
324  int pitch, svq1_pmv *motion, int x, int y,
325  int width, int height)
326 {
327  uint8_t *src;
328  uint8_t *dst;
329  svq1_pmv mv;
330  svq1_pmv *pmv[3];
331  int result;
332 
333  /* predict and decode motion vector */
334  pmv[0] = &motion[0];
335  if (y == 0) {
336  pmv[1] =
337  pmv[2] = pmv[0];
338  } else {
339  pmv[1] = &motion[x / 8 + 2];
340  pmv[2] = &motion[x / 8 + 4];
341  }
342 
343  result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
344  if (result)
345  return result;
346 
347  motion[0].x =
348  motion[x / 8 + 2].x =
349  motion[x / 8 + 3].x = mv.x;
350  motion[0].y =
351  motion[x / 8 + 2].y =
352  motion[x / 8 + 3].y = mv.y;
353 
354  mv.x = av_clip(mv.x, -2 * x, 2 * (width - x - 16));
355  mv.y = av_clip(mv.y, -2 * y, 2 * (height - y - 16));
356 
357  src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch];
358  dst = current;
359 
360  hdsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16);
361 
362  return 0;
363 }
364 
366  uint8_t *current, uint8_t *previous,
367  int pitch, svq1_pmv *motion, int x, int y,
368  int width, int height)
369 {
370  uint8_t *src;
371  uint8_t *dst;
372  svq1_pmv mv;
373  svq1_pmv *pmv[4];
374  int i, result;
375 
376  /* predict and decode motion vector (0) */
377  pmv[0] = &motion[0];
378  if (y == 0) {
379  pmv[1] =
380  pmv[2] = pmv[0];
381  } else {
382  pmv[1] = &motion[(x / 8) + 2];
383  pmv[2] = &motion[(x / 8) + 4];
384  }
385 
386  result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
387  if (result)
388  return result;
389 
390  /* predict and decode motion vector (1) */
391  pmv[0] = &mv;
392  if (y == 0) {
393  pmv[1] =
394  pmv[2] = pmv[0];
395  } else {
396  pmv[1] = &motion[(x / 8) + 3];
397  }
398  result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv);
399  if (result)
400  return result;
401 
402  /* predict and decode motion vector (2) */
403  pmv[1] = &motion[0];
404  pmv[2] = &motion[(x / 8) + 1];
405 
406  result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv);
407  if (result)
408  return result;
409 
410  /* predict and decode motion vector (3) */
411  pmv[2] = &motion[(x / 8) + 2];
412  pmv[3] = &motion[(x / 8) + 3];
413 
414  result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv);
415  if (result)
416  return result;
417 
418  /* form predictions */
419  for (i = 0; i < 4; i++) {
420  int mvx = pmv[i]->x + (i & 1) * 16;
421  int mvy = pmv[i]->y + (i >> 1) * 16;
422 
423  // FIXME: clipping or padding?
424  mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
425  mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
426 
427  src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
428  dst = current;
429 
430  hdsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
431 
432  /* select next block */
433  if (i & 1)
434  current += 8 * (pitch - 1);
435  else
436  current += 8;
437  }
438 
439  return 0;
440 }
441 
443  GetBitContext *bitbuf,
444  uint8_t *current, uint8_t *previous,
445  int pitch, svq1_pmv *motion, int x, int y,
446  int width, int height)
447 {
448  uint32_t block_type;
449  int result = 0;
450 
451  /* get block type */
452  block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
453 
454  /* reset motion vectors */
455  if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
456  motion[0].x =
457  motion[0].y =
458  motion[x / 8 + 2].x =
459  motion[x / 8 + 2].y =
460  motion[x / 8 + 3].x =
461  motion[x / 8 + 3].y = 0;
462  }
463 
464  switch (block_type) {
465  case SVQ1_BLOCK_SKIP:
466  svq1_skip_block(current, previous, pitch, x, y);
467  break;
468 
469  case SVQ1_BLOCK_INTER:
470  result = svq1_motion_inter_block(hdsp, bitbuf, current, previous,
471  pitch, motion, x, y, width, height);
472 
473  if (result != 0) {
474  av_dlog(avctx, "Error in svq1_motion_inter_block %i\n", result);
475  break;
476  }
477  result = svq1_decode_block_non_intra(bitbuf, current, pitch);
478  break;
479 
480  case SVQ1_BLOCK_INTER_4V:
481  result = svq1_motion_inter_4v_block(hdsp, bitbuf, current, previous,
482  pitch, motion, x, y, width, height);
483 
484  if (result != 0) {
485  av_dlog(avctx, "Error in svq1_motion_inter_4v_block %i\n", result);
486  break;
487  }
488  result = svq1_decode_block_non_intra(bitbuf, current, pitch);
489  break;
490 
491  case SVQ1_BLOCK_INTRA:
492  result = svq1_decode_block_intra(bitbuf, current, pitch);
493  break;
494  }
495 
496  return result;
497 }
498 
500 {
501  uint8_t seed;
502  int i;
503 
504  out[0] = get_bits(bitbuf, 8);
505  seed = string_table[out[0]];
506 
507  for (i = 1; i <= out[0]; i++) {
508  out[i] = get_bits(bitbuf, 8) ^ seed;
509  seed = string_table[out[i] ^ seed];
510  }
511 }
512 
514 {
515  SVQ1Context *s = avctx->priv_data;
516  GetBitContext *bitbuf = &s->gb;
517  int frame_size_code;
518  int width = s->width;
519  int height = s->height;
520 
521  skip_bits(bitbuf, 8); /* temporal_reference */
522 
523  /* frame type */
524  s->nonref = 0;
525  switch (get_bits(bitbuf, 2)) {
526  case 0:
527  frame->pict_type = AV_PICTURE_TYPE_I;
528  break;
529  case 2:
530  s->nonref = 1;
531  case 1:
532  frame->pict_type = AV_PICTURE_TYPE_P;
533  break;
534  default:
535  av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
536  return AVERROR_INVALIDDATA;
537  }
538 
539  if (frame->pict_type == AV_PICTURE_TYPE_I) {
540  /* unknown fields */
541  if (s->frame_code == 0x50 || s->frame_code == 0x60) {
542  int csum = get_bits(bitbuf, 16);
543 
544  csum = ff_svq1_packet_checksum(bitbuf->buffer,
545  bitbuf->size_in_bits >> 3,
546  csum);
547 
548  av_dlog(avctx, "%s checksum (%02x) for packet data\n",
549  (csum == 0) ? "correct" : "incorrect", csum);
550  }
551 
552  if ((s->frame_code ^ 0x10) >= 0x50) {
553  uint8_t msg[256];
554 
555  svq1_parse_string(bitbuf, msg);
556 
557  av_log(avctx, AV_LOG_INFO,
558  "embedded message: \"%s\"\n", (char *)msg);
559  }
560 
561  skip_bits(bitbuf, 2);
562  skip_bits(bitbuf, 2);
563  skip_bits1(bitbuf);
564 
565  /* load frame size */
566  frame_size_code = get_bits(bitbuf, 3);
567 
568  if (frame_size_code == 7) {
569  /* load width, height (12 bits each) */
570  width = get_bits(bitbuf, 12);
571  height = get_bits(bitbuf, 12);
572 
573  if (!width || !height)
574  return AVERROR_INVALIDDATA;
575  } else {
576  /* get width, height from table */
577  width = ff_svq1_frame_size_table[frame_size_code][0];
578  height = ff_svq1_frame_size_table[frame_size_code][1];
579  }
580  }
581 
582  /* unknown fields */
583  if (get_bits1(bitbuf)) {
584  skip_bits1(bitbuf); /* use packet checksum if (1) */
585  skip_bits1(bitbuf); /* component checksums after image data if (1) */
586 
587  if (get_bits(bitbuf, 2) != 0)
588  return AVERROR_INVALIDDATA;
589  }
590 
591  if (get_bits1(bitbuf)) {
592  skip_bits1(bitbuf);
593  skip_bits(bitbuf, 4);
594  skip_bits1(bitbuf);
595  skip_bits(bitbuf, 2);
596 
597  while (get_bits1(bitbuf))
598  skip_bits(bitbuf, 8);
599  }
600 
601  s->width = width;
602  s->height = height;
603  return 0;
604 }
605 
606 static int svq1_decode_frame(AVCodecContext *avctx, void *data,
607  int *got_frame, AVPacket *avpkt)
608 {
609  const uint8_t *buf = avpkt->data;
610  int buf_size = avpkt->size;
611  SVQ1Context *s = avctx->priv_data;
612  AVFrame *cur = data;
613  uint8_t *current;
614  int result, i, x, y, width, height;
615  svq1_pmv *pmv;
616 
617  /* initialize bit buffer */
618  init_get_bits(&s->gb, buf, buf_size * 8);
619 
620  /* decode frame header */
621  s->frame_code = get_bits(&s->gb, 22);
622 
623  if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
624  return AVERROR_INVALIDDATA;
625 
626  /* swap some header bytes (why?) */
627  if (s->frame_code != 0x20) {
628  uint32_t *src = (uint32_t *)(buf + 4);
629 
630  if (buf_size < 36)
631  return AVERROR_INVALIDDATA;
632 
633  for (i = 0; i < 4; i++)
634  src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
635  }
636 
637  result = svq1_decode_frame_header(avctx, cur);
638  if (result != 0) {
639  av_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
640  return result;
641  }
642  avcodec_set_dimensions(avctx, s->width, s->height);
643 
644  if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
645  (avctx->skip_frame >= AVDISCARD_NONKEY &&
646  cur->pict_type != AV_PICTURE_TYPE_I) ||
647  avctx->skip_frame >= AVDISCARD_ALL)
648  return buf_size;
649 
650  result = ff_get_buffer(avctx, cur, s->nonref ? 0 : AV_GET_BUFFER_FLAG_REF);
651  if (result < 0)
652  return result;
653 
654  pmv = av_malloc((FFALIGN(s->width, 16) / 8 + 3) * sizeof(*pmv));
655  if (!pmv)
656  return AVERROR(ENOMEM);
657 
658  /* decode y, u and v components */
659  for (i = 0; i < 3; i++) {
660  int linesize = cur->linesize[i];
661  if (i == 0) {
662  width = FFALIGN(s->width, 16);
663  height = FFALIGN(s->height, 16);
664  } else {
665  if (avctx->flags & CODEC_FLAG_GRAY)
666  break;
667  width = FFALIGN(s->width / 4, 16);
668  height = FFALIGN(s->height / 4, 16);
669  }
670 
671  current = cur->data[i];
672 
673  if (cur->pict_type == AV_PICTURE_TYPE_I) {
674  /* keyframe */
675  for (y = 0; y < height; y += 16) {
676  for (x = 0; x < width; x += 16) {
677  result = svq1_decode_block_intra(&s->gb, &current[x],
678  linesize);
679  if (result) {
680  av_log(avctx, AV_LOG_ERROR,
681  "Error in svq1_decode_block %i (keyframe)\n",
682  result);
683  goto err;
684  }
685  }
686  current += 16 * linesize;
687  }
688  } else {
689  /* delta frame */
690  uint8_t *previous = s->prev->data[i];
691  if (!previous ||
692  s->prev->width != s->width || s->prev->height != s->height) {
693  av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
694  result = AVERROR_INVALIDDATA;
695  goto err;
696  }
697 
698  memset(pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
699 
700  for (y = 0; y < height; y += 16) {
701  for (x = 0; x < width; x += 16) {
702  result = svq1_decode_delta_block(avctx, &s->hdsp,
703  &s->gb, &current[x],
704  previous, linesize,
705  pmv, x, y, width, height);
706  if (result != 0) {
707  av_dlog(avctx,
708  "Error in svq1_decode_delta_block %i\n",
709  result);
710  goto err;
711  }
712  }
713 
714  pmv[0].x =
715  pmv[0].y = 0;
716 
717  current += 16 * linesize;
718  }
719  }
720  }
721 
722  if (!s->nonref) {
723  av_frame_unref(s->prev);
724  result = av_frame_ref(s->prev, cur);
725  if (result < 0)
726  goto err;
727  }
728 
729  *got_frame = 1;
730  result = buf_size;
731 
732 err:
733  av_free(pmv);
734  return result;
735 }
736 
738 {
739  SVQ1Context *s = avctx->priv_data;
740  int i;
741  int offset = 0;
742 
743  s->prev = avcodec_alloc_frame();
744  if (!s->prev)
745  return AVERROR(ENOMEM);
746 
747  s->width = avctx->width + 3 & ~3;
748  s->height = avctx->height + 3 & ~3;
749  avctx->pix_fmt = AV_PIX_FMT_YUV410P;
750 
751  ff_hpeldsp_init(&s->hdsp, avctx->flags);
752 
753  INIT_VLC_STATIC(&svq1_block_type, 2, 4,
754  &ff_svq1_block_type_vlc[0][1], 2, 1,
755  &ff_svq1_block_type_vlc[0][0], 2, 1, 6);
756 
757  INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
758  &ff_mvtab[0][1], 2, 1,
759  &ff_mvtab[0][0], 2, 1, 176);
760 
761  for (i = 0; i < 6; i++) {
762  static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
763  { 10, 10, 14, 14, 14, 16 } };
764  static VLC_TYPE table[168][2];
765  svq1_intra_multistage[i].table = &table[offset];
766  svq1_intra_multistage[i].table_allocated = sizes[0][i];
767  offset += sizes[0][i];
768  init_vlc(&svq1_intra_multistage[i], 3, 8,
769  &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
770  &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1,
772  svq1_inter_multistage[i].table = &table[offset];
773  svq1_inter_multistage[i].table_allocated = sizes[1][i];
774  offset += sizes[1][i];
775  init_vlc(&svq1_inter_multistage[i], 3, 8,
776  &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
777  &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1,
779  }
780 
781  INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
782  &ff_svq1_intra_mean_vlc[0][1], 4, 2,
783  &ff_svq1_intra_mean_vlc[0][0], 4, 2, 632);
784 
785  INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
786  &ff_svq1_inter_mean_vlc[0][1], 4, 2,
787  &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1434);
788 
789  return 0;
790 }
791 
793 {
794  SVQ1Context *s = avctx->priv_data;
795 
796  av_frame_free(&s->prev);
797 
798  return 0;
799 }
800 
801 static void svq1_flush(AVCodecContext *avctx)
802 {
803  SVQ1Context *s = avctx->priv_data;
804 
805  av_frame_unref(s->prev);
806 }
807 
809  .name = "svq1",
810  .type = AVMEDIA_TYPE_VIDEO,
811  .id = AV_CODEC_ID_SVQ1,
812  .priv_data_size = sizeof(SVQ1Context),
816  .capabilities = CODEC_CAP_DR1,
817  .flush = svq1_flush,
818  .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P,
819  AV_PIX_FMT_NONE },
820  .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
821 };
discard all frames except keyframes
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static VLC svq1_inter_multistage[6]
Definition: svq1dec.c:50
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
Definition: svq1dec.c:365
static VLC svq1_motion_component
Definition: svq1dec.c:48
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
uint16_t ff_svq1_packet_checksum(const uint8_t *data, const int length, int value)
Definition: svq13.c:60
struct svq1_pmv_s svq1_pmv
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
const uint8_t * buffer
Definition: get_bits.h:55
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
#define VLC_TYPE
Definition: get_bits.h:61
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)
#define SVQ1_BLOCK_INTRA
Definition: svq1.h:43
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
#define FFALIGN(x, a)
Definition: common.h:63
enum AVDiscard skip_frame
Skip decoding for selected frames.
const uint16_t ff_svq1_frame_size_table[7][2]
Definition: svq1.c:40
#define SVQ1_BLOCK_SKIP
Definition: svq1.h:40
static av_cold int svq1_decode_end(AVCodecContext *avctx)
Definition: svq1dec.c:792
uint8_t
#define av_cold
Definition: attributes.h:78
static VLC svq1_intra_mean
Definition: svq1dec.c:51
const int8_t *const ff_svq1_inter_codebooks[6]
Definition: svq1_cb.h:776
window constants for m
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
Definition: get_bits.h:445
static VLC svq1_intra_multistage[6]
Definition: svq1dec.c:49
struct SVQ1Context SVQ1Context
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
bitstream reader API header.
frame
Definition: stft.m:14
#define SVQ1_ADD_CODEBOOK()
Definition: svq1dec.c:121
static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
Definition: svq1dec.c:513
int width
width and height of the video frame
Definition: frame.h:122
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const int sizes[][2]
Definition: img2dec.c:68
static const struct endianess table[]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)
Definition: svq1dec.c:144
int flags
CODEC_FLAG_*.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define SVQ1_BLOCK_INTER
Definition: svq1.h:41
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
static void svq1_skip_block(uint8_t *current, uint8_t *previous, int pitch, int x, int y)
Definition: svq1dec.c:305
external API header
Sorenson Vector Quantizer #1 (SVQ1) video codec.
Definition: get_bits.h:63
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition: hpeldsp.c:37
AVFrame * avcodec_alloc_frame(void)
Allocate an AVFrame and set its fields to default values.
Half-pel DSP context.
Definition: hpeldsp.h:45
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, int pitch)
Definition: svq1dec.c:156
static void svq1_parse_string(GetBitContext *bitbuf, uint8_t *out)
Definition: svq1dec.c:499
int width
Definition: svq1dec.c:64
const uint8_t ff_svq1_block_type_vlc[4][2]
Definition: svq1_vlc.h:27
int width
picture width / height.
HpelDSPContext hdsp
Definition: svq1dec.c:61
int size_in_bits
Definition: get_bits.h:57
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
static void svq1_flush(AVCodecContext *avctx)
Definition: svq1dec.c:801
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
FIXME Range Coding of cr are level
Definition: snow.txt:367
#define INIT_VLC_USE_NEW_STATIC
Definition: get_bits.h:443
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:50
static void flush(AVCodecContext *avctx)
static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
Definition: svq1dec.c:442
int table_allocated
Definition: get_bits.h:66
static const int8_t mv[256][2]
NULL
Definition: eval.c:55
Half-pel DSP functions.
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
AVFrame * prev
Definition: svq1dec.c:63
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
static unsigned int seed
Definition: videogen.c:78
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
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: get_bits.h:426
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
Definition: hpeldsp.h:56
void * buf
Definition: avisynth_c.h:594
static VLC svq1_inter_mean
Definition: svq1dec.c:52
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:298
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:74
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
static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
Definition: svq1dec.c:322
const uint8_t ff_mvtab[33][2]
Definition: h263data.h:91
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
GetBitContext gb
Definition: svq1dec.c:62
#define mid_pred
Definition: mathops.h:94
static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, int pitch)
Definition: svq1dec.c:221
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:123
int height
Definition: svq1dec.c:65
#define SVQ1_BLOCK_INTER_4V
Definition: svq1.h:42
int av_frame_ref(AVFrame *dst, AVFrame *src)
Setup a new reference to the data described by an given frame.
Definition: frame.c:228
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
discard all non reference
static int svq1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: svq1dec.c:606
const int8_t *const ff_svq1_intra_codebooks[6]
Definition: svq1_cb.h:1519
common internal api header.
int x
Definition: svq1dec.c:56
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
Definition: svq1_vlc.h:33
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
int frame_code
Definition: svq1dec.c:66
static const uint8_t string_table[256]
Definition: svq1dec.c:70
static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv)
Definition: svq1dec.c:279
const uint16_t ff_svq1_inter_mean_vlc[512][2]
Definition: svq1_vlc.h:136
#define SVQ1_PROCESS_VECTOR()
Definition: svq1dec.c:105
int nonref
Definition: svq1dec.c:67
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
static av_cold int svq1_decode_init(AVCodecContext *avctx)
Definition: svq1dec.c:737
int height
Definition: frame.h:122
#define AV_LOG_INFO
Definition: log.h:156
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
static VLC svq1_block_type
Definition: svq1dec.c:47
AVCodec ff_svq1_decoder
Definition: svq1dec.c:808
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
This structure stores compressed data.
const uint16_t ff_svq1_intra_mean_vlc[256][2]
Definition: svq1_vlc.h:67
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
int y
Definition: svq1dec.c:57
Predicted.
Definition: avutil.h:217