FFmpeg
Loading...
Searching...
No Matches
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
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
56
57/* motion vector (prediction) */
58typedef struct svq1_pmv_s {
59 int x;
60 int y;
61} svq1_pmv;
62
63typedef struct SVQ1Context {
67
68 uint8_t *pkt_swapped;
70
73
74 int width;
75 int height;
77 int nonref; // 1 if the current frame won't be referenced
78
81
82static 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
168static 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)) {
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
235static 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)) {
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
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
330static 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
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
525static 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
540static 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;
562 case 1:
563 frame->pict_type = AV_PICTURE_TYPE_P;
564 break;
565 default:
566 av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
567 return AVERROR_INVALIDDATA;
568 }
569
570 if (frame->pict_type == AV_PICTURE_TYPE_I) {
571 /* unknown fields */
572 if (s->frame_code == 0x50 || s->frame_code == 0x60) {
573 int csum = get_bits(bitbuf, 16);
574
575 csum = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), av_bswap16(csum), bitbuf->buffer, bitbuf->size_in_bits >> 3));
576
577 ff_dlog(avctx, "%s checksum (%02x) for packet data\n",
578 (csum == 0) ? "correct" : "incorrect", csum);
579 }
580
581 if ((s->frame_code ^ 0x10) >= 0x50) {
582 uint8_t msg[257];
583
584 svq1_parse_string(bitbuf, msg);
585
586 av_log(avctx, AV_LOG_INFO,
587 "embedded message:\n%s\n", ((char *)msg) + 1);
588 }
589
590 skip_bits(bitbuf, 2);
591 skip_bits(bitbuf, 2);
592 skip_bits1(bitbuf);
593
594 /* load frame size */
595 frame_size_code = get_bits(bitbuf, 3);
596
597 if (frame_size_code == 7) {
598 /* load width, height (12 bits each) */
599 width = get_bits(bitbuf, 12);
600 height = get_bits(bitbuf, 12);
601
602 if (!width || !height)
603 return AVERROR_INVALIDDATA;
604 } else {
605 /* get width, height from table */
606 width = ff_svq1_frame_size_table[frame_size_code][0];
607 height = ff_svq1_frame_size_table[frame_size_code][1];
608 }
609 }
610
611 /* unknown fields */
612 if (get_bits1(bitbuf)) {
613 skip_bits1(bitbuf); /* use packet checksum if (1) */
614 skip_bits1(bitbuf); /* component checksums after image data if (1) */
615
616 if (get_bits(bitbuf, 2) != 0)
617 return AVERROR_INVALIDDATA;
618 }
619
620 if (get_bits1(bitbuf)) {
621 skip_bits1(bitbuf);
622 skip_bits(bitbuf, 4);
623 skip_bits1(bitbuf);
624 skip_bits(bitbuf, 2);
625
626 if (skip_1stop_8data_bits(bitbuf) < 0)
627 return AVERROR_INVALIDDATA;
628 }
629 if (get_bits_left(bitbuf) <= 0)
630 return AVERROR_INVALIDDATA;
631
632 s->width = width;
633 s->height = height;
634 return 0;
635}
636
638 int *got_frame, AVPacket *avpkt)
639{
640 const uint8_t *buf = avpkt->data;
641 int buf_size = avpkt->size;
642 SVQ1Context *s = avctx->priv_data;
643 uint8_t *current;
644 int result, i, x, y, width, height, buggy;
645 int ret;
646
647 /* initialize bit buffer */
648 ret = init_get_bits8(&s->gb, buf, buf_size);
649 if (ret < 0)
650 return ret;
651
652 /* decode frame header */
653 s->frame_code = get_bits(&s->gb, 22);
654
655 if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
656 return AVERROR_INVALIDDATA;
657
658 /* swap some header bytes (why?) */
659 if (s->frame_code != 0x20) {
660 uint32_t *src;
661
662 if (buf_size < 9 * 4) {
663 av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
664 return AVERROR_INVALIDDATA;
665 }
666
667 av_fast_padded_malloc(&s->pkt_swapped,
668 &s->pkt_swapped_allocated,
669 buf_size);
670 if (!s->pkt_swapped)
671 return AVERROR(ENOMEM);
672
673 memcpy(s->pkt_swapped, buf, buf_size);
674 buf = s->pkt_swapped;
675 init_get_bits(&s->gb, buf, buf_size * 8);
676 skip_bits(&s->gb, 22);
677
678 src = (uint32_t *)(s->pkt_swapped + 4);
679
680 for (i = 0; i < 4; i++)
681 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
682 }
683
684 result = svq1_decode_frame_header(avctx, cur, &buggy);
685 if (result != 0) {
686 ff_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
687 return result;
688 }
689
690 result = ff_set_dimensions(avctx, s->width, s->height);
691 if (result < 0)
692 return result;
693
694 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
695 (avctx->skip_frame >= AVDISCARD_NONKEY &&
696 cur->pict_type != AV_PICTURE_TYPE_I) ||
697 avctx->skip_frame >= AVDISCARD_ALL)
698 return buf_size;
699
700 // Reject obviously too-small packets early: require at least one remaining bit per aligned luma macroblock.
701 // FFALIGN(s->width, 16) * FFALIGN(s->height, 16) / 256 represent the number of Macroblocks
702 if (get_bits_left(&s->gb) < FFALIGN(s->width, 16) * FFALIGN(s->height, 16) / 256)
703 return AVERROR_INVALIDDATA;
704
705 result = ff_get_buffer(avctx, cur, s->nonref ? 0 : AV_GET_BUFFER_FLAG_REF);
706 if (result < 0)
707 return result;
708
709 av_fast_padded_malloc(&s->pmv, &s->pmv_allocated, (FFALIGN(s->width, 16) / 8 + 3) * sizeof(*s->pmv));
710 if (!s->pmv)
711 return AVERROR(ENOMEM);
712
713 /* decode y, u and v components */
714 for (i = 0; i < 3; i++) {
715 int linesize = cur->linesize[i];
716 if (i == 0) {
717 width = FFALIGN(s->width, 16);
718 height = FFALIGN(s->height, 16);
719 } else {
720 if (avctx->flags & AV_CODEC_FLAG_GRAY)
721 break;
722 width = FFALIGN(s->width / 4, 16);
723 height = FFALIGN(s->height / 4, 16);
724 }
725
726 current = cur->data[i];
727
728 if (cur->pict_type == AV_PICTURE_TYPE_I) {
729 /* keyframe */
730 for (y = 0; y < height; y += 16) {
731 for (x = 0; x < width; x += 16) {
732 result = svq1_decode_block_intra(&s->gb, &current[x],
733 linesize);
734 if (result) {
735 av_log(avctx, AV_LOG_ERROR,
736 "Error in svq1_decode_block %i (keyframe)\n",
737 result);
738 return result;
739 }
740 }
741 current += 16 * linesize;
742 }
743 } else {
744 /* delta frame */
745 uint8_t *previous = s->prev->data[i];
746 if (!previous ||
747 s->prev->width != s->width || s->prev->height != s->height) {
748 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
749 return AVERROR_INVALIDDATA;
750 }
751
752 memset(s->pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
753
754 for (y = 0; y < height; y += 16) {
755 for (x = 0; x < width; x += 16) {
756 result = svq1_decode_delta_block(avctx, &s->hdsp,
757 &s->gb, &current[x],
758 previous, linesize,
759 s->pmv, x, y, width, height, buggy);
760 if (result != 0) {
761 ff_dlog(avctx,
762 "Error in svq1_decode_delta_block %i\n",
763 result);
764 return result;
765 }
766 }
767
768 s->pmv[0].x =
769 s->pmv[0].y = 0;
770
771 current += 16 * linesize;
772 }
773 }
774 }
775
776 if (!s->nonref) {
777 result = av_frame_replace(s->prev, cur);
778 if (result < 0)
779 return result;
780 }
781
782 *got_frame = 1;
783 result = buf_size;
784
785 return result;
786}
787
788static av_cold void svq1_static_init(void)
789{
790 static VLCElem table[196];
792
794 &ff_svq1_block_type_vlc[0][1], 2, 1,
795 &ff_svq1_block_type_vlc[0][0], 2, 1, 0);
796
798 &ff_mvtab[0][1], 2, 1,
799 &ff_mvtab[0][0], 2, 1, 0);
800
801 for (int i = 0; i < 6; i++) {
804 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
805 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 0);
808 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
809 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 0);
810 }
811
813 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
814 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 0);
815
817 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
818 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 0);
819}
820
822{
823 static AVOnce init_static_once = AV_ONCE_INIT;
824 SVQ1Context *s = avctx->priv_data;
825
826 s->prev = av_frame_alloc();
827 if (!s->prev)
828 return AVERROR(ENOMEM);
829
830 s->width = avctx->width + 3 & ~3;
831 s->height = avctx->height + 3 & ~3;
833
834 ff_hpeldsp_init(&s->hdsp, avctx->flags);
835
836 ff_thread_once(&init_static_once, svq1_static_init);
837
838 s->last_tempref = 0xFF;
839
840 return 0;
841}
842
844{
845 SVQ1Context *s = avctx->priv_data;
846
847 av_frame_free(&s->prev);
848 av_freep(&s->pkt_swapped);
849 s->pkt_swapped_allocated = 0;
850 av_freep(&s->pmv);
851 s->pmv_allocated = 0;
852
853 return 0;
854}
855
857{
858 SVQ1Context *s = avctx->priv_data;
859
860 av_frame_unref(s->prev);
861}
862
864 .p.name = "svq1",
865 CODEC_LONG_NAME("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
866 .p.type = AVMEDIA_TYPE_VIDEO,
867 .p.id = AV_CODEC_ID_SVQ1,
868 .priv_data_size = sizeof(SVQ1Context),
872 .p.capabilities = AV_CODEC_CAP_DR1,
873 .flush = svq1_flush,
874};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
const FFCodec ff_svq1_decoder
Definition svq1dec.c:863
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
static const unsigned codebook[256][2]
Definition cfhdenc.c:41
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define av_clip
Definition common.h:100
#define NULL
Definition coverity.c:32
Public header for CRC hash function implementation.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Definition utils.c:91
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static struct @346255127015250356166251341105367306144006377143 state
static struct @111144215057303131116103221376075045141373005341 current
bitstream reader API header.
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:645
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
static int skip_1stop_8data_bits(GetBitContext *gb)
Definition get_bits.h:693
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
static void skip_bits1(GetBitContext *s)
Definition get_bits.h:416
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition get_bits.h:517
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition avcodec.h:415
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition avcodec.h:302
@ AV_CODEC_ID_SVQ1
Definition codec_id.h:72
@ AVDISCARD_ALL
discard all
Definition defs.h:232
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:231
@ AVDISCARD_NONREF
discard all non reference
Definition defs.h:228
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
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition crc.c:389
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:421
@ AV_CRC_16_CCITT
Definition crc.h:51
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
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
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
const uint8_t ff_mvtab[33][2]
Definition h263data.c:88
H.263 tables.
Half-pel DSP functions.
static const int8_t mv[256][2]
Definition 4xm.c:81
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
Definition hpeldsp.c:337
Macro definitions for various function/variable attributes.
#define av_fallthrough
Definition attributes.h:67
#define av_cold
Definition attributes.h:117
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define FFALIGN(x, a)
Definition macros.h:78
static av_const int sign_extend(int val, unsigned bits)
Definition mathops.h:135
#define mid_pred
Definition mathops.h:115
Memory handling functions.
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
static const uint16_t table[]
Definition prosumer.c:203
#define av_bswap16
Definition bswap.h:28
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition avcodec.h:1667
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
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:517
enum AVPictureType pict_type
Picture type of the frame.
Definition frame.h:564
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
const uint8_t * buffer
Definition get_bits.h:110
Half-pel DSP context.
Definition hpeldsp.h:46
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
Definition hpeldsp.h:57
HpelDSPContext hdsp
Definition svq1dec.c:64
int pmv_allocated
Definition svq1dec.c:72
int last_tempref
Definition svq1dec.c:79
uint8_t * pkt_swapped
Definition svq1dec.c:68
int width
Definition svq1dec.c:74
int pkt_swapped_allocated
Definition svq1dec.c:69
int height
Definition svq1dec.c:75
GetBitContext gb
Definition svq1dec.c:65
int frame_code
Definition svq1dec.c:76
AVFrame * prev
Definition svq1dec.c:66
svq1_pmv * pmv
Definition svq1dec.c:71
int nonref
Definition svq1dec.c:77
Definition vlc.h:32
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
Definition vlc.h:220
int y
Definition svq1dec.c:60
int x
Definition svq1dec.c:59
const uint16_t ff_svq1_frame_size_table[7][2]
Definition svq1.c:40
Sorenson Vector Quantizer #1 (SVQ1) video codec.
#define SVQ1_BLOCK_INTER_4V
Definition svq1.h:44
#define SVQ1_BLOCK_INTER
Definition svq1.h:43
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
Definition svq1_vlc.h:33
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
Definition svq1_vlc.h:50
const int8_t *const ff_svq1_intra_codebooks[6]
Definition svq1_cb.h:1519
#define SVQ1_BLOCK_INTRA
Definition svq1.h:45
#define SVQ1_BLOCK_SKIP
Definition svq1.h:42
const uint16_t ff_svq1_inter_mean_vlc[512][2]
Definition svq1_vlc.h:136
const uint16_t ff_svq1_intra_mean_vlc[256][2]
Definition svq1_vlc.h:67
const uint8_t ff_svq1_block_type_vlc[4][2]
Definition svq1_vlc.h:27
FF_VISIBILITY_PUSH_HIDDEN const int8_t *const ff_svq1_inter_codebooks[6]
Definition svq1_cb.h:776
static VLCElem svq1_motion_component[176]
Definition svq1dec.c:51
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
static av_cold int svq1_decode_end(AVCodecContext *avctx)
Definition svq1dec.c:843
static const VLCElem * svq1_intra_multistage[6]
Definition svq1dec.c:52
static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv)
Definition svq1dec.c:304
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
static av_cold int svq1_decode_init(AVCodecContext *avctx)
Definition svq1dec.c:821
static const uint8_t string_table[256]
Definition svq1dec.c:82
static VLCElem svq1_inter_mean[1434]
Definition svq1dec.c:55
static VLCElem svq1_intra_mean[632]
Definition svq1dec.c:54
static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame, int *buggy)
Definition svq1dec.c:540
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)
Definition svq1dec.c:156
static VLCElem svq1_block_type[8]
Definition svq1dec.c:50
#define SVQ1_BLOCK_TYPE_VLC_BITS
Definition svq1dec.c:49
static const VLCElem * svq1_inter_multistage[6]
Definition svq1dec.c:53
static void svq1_parse_string(GetBitContext *bitbuf, uint8_t out[257])
Definition svq1dec.c:525
#define SVQ1_ADD_CODEBOOK()
Definition svq1dec.c:133
static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch)
Definition svq1dec.c:168
static void svq1_skip_block(uint8_t *current, uint8_t *previous, ptrdiff_t pitch, int x, int y)
Definition svq1dec.c:330
static int svq1_decode_frame(AVCodecContext *avctx, AVFrame *cur, int *got_frame, AVPacket *avpkt)
Definition svq1dec.c:637
static av_cold void svq1_static_init(void)
Definition svq1dec.c:788
static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch, int buggy)
Definition svq1dec.c:235
#define SVQ1_PROCESS_VECTOR()
Definition svq1dec.c:117
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
static av_cold void svq1_flush(AVCodecContext *avctx)
Definition svq1dec.c:856
uint8_t level
Definition svq3.c:208
#define ff_dlog(a,...)
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
static FILE * out
Definition movenc.c:55
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
static float mean(const float *input, int size)
Definition vf_nnedi.c:861
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static unsigned int seed
Definition videogen.c:78
#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
#define VLC_INIT_STATE(_table)
Definition vlc.h:225
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