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
38
47
48 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
55
56 /* motion vector (prediction) */
60 } svq1_pmv;
61
66
69
72
76 int nonref;
// 1 if the current frame won't be referenced
77
80
82 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
83 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
84 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
85 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
86 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
87 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
88 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
89 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
90 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
91 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
92 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
93 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
94 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
95 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
96 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
97 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
98 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
99 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
100 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
101 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
102 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
103 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
104 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
105 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
106 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
107 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
108 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
109 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
110 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
111 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
112 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
113 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
114 };
115
116 #define SVQ1_PROCESS_VECTOR() \
117 for (; level > 0; i++) { \
118 /* process next depth */ \
119 if (i == m) { \
120 m = n; \
121 if (--level == 0) \
122 break; \
123 } \
124 /* divide block if next bit set */ \
125 if (!get_bits1(bitbuf)) \
126 break; \
127 /* add child nodes */ \
128 list[n++] = list[i]; \
129 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
130 }
131
132 #define SVQ1_ADD_CODEBOOK() \
133 /* add codebook entries to vector */ \
134 for (j = 0; j < stages; j++) { \
135 n3 = codebook[entries[j]] ^ 0x80808080; \
136 n1 += (n3 & 0xFF00FF00) >> 8; \
137 n2 += n3 & 0x00FF00FF; \
138 } \
139 \
140 /* clip to [0..255] */ \
141 if (n1 & 0xFF00FF00) { \
142 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
143 n1 += 0x7F007F00; \
144 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
145 n1 &= n3 & 0x00FF00FF; \
146 } \
147 \
148 if (n2 & 0xFF00FF00) { \
149 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
150 n2 += 0x7F007F00; \
151 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
152 n2 &= n3 & 0x00FF00FF; \
153 }
154
155 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
156 codebook = (const uint32_t *)cbook[level]; \
157 if (stages > 0) \
158 bit_cache = get_bits(bitbuf, 4 * stages); \
159 /* calculate codebook entries for this vector */ \
160 for (j = 0; j < stages; j++) { \
161 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
162 16 * j) << (level + 1); \
163 } \
164 mean -= stages * 128; \
165 n4 = (mean << 16) + mean;
166
168 ptrdiff_t pitch)
169 {
170 uint32_t bit_cache;
174 int entries[6];
176 int stages;
179 uint32_t n1, n2, n3, n4;
180
181 /* initialize list for breadth first processing of vectors */
183
184 /* recursively process vector */
185 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
187
188 /* destination address and vector size */
192
193 /* get number of stages (-1 skips vector, 0 for mean only) */
195
196 if (stages == -1) {
197 for (y = 0; y <
height; y++)
198 memset(&
dst[y * (pitch / 4)], 0,
width);
199 continue; /* skip vector */
200 }
201
202 if ((stages > 0 &&
level >= 4)) {
204 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
207 }
209
211
212 if (stages == 0) {
213 for (y = 0; y <
height; y++)
215 } else {
217
218 for (y = 0; y <
height; y++) {
220 n1 = n4;
221 n2 = n4;
223 /* store result */
224 dst[x] = n1 << 8 | n2;
225 }
227 }
228 }
229 }
230
231 return 0;
232 }
233
235 ptrdiff_t pitch, int buggy)
236 {
237 uint32_t bit_cache;
241 int entries[6];
243 int stages;
246 uint32_t n1, n2, n3, n4;
247
248 /* initialize list for breadth first processing of vectors */
250
251 /* recursively process vector */
252 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
254
255 /* destination address and vector size */
259
260 /* get number of stages (-1 skips vector, 0 for mean only) */
262
263 if (stages == -1)
264 continue; /* skip vector */
265
266 if ((stages > 0 &&
level >= 4)) {
268 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
271 }
273
275
276 if (buggy) {
279 else if (
mean == 128)
281 }
282
284
285 for (y = 0; y <
height; y++) {
286 for (x = 0; x <
width / 4; x++) {
288 /* add mean value to vector */
289 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
290 n2 = n4 + (n3 & 0x00FF00FF);
292 /* store result */
293 dst[x] = n1 << 8 | n2;
296 }
298 }
299 }
300 return 0;
301 }
302
304 svq1_pmv **pmv)
305 {
308
309 for (
i = 0;
i < 2;
i++) {
310 /* get motion code */
317 }
318
319 /* add median of motion vector predictors and clip result */
322 else
324 }
325
326 return 0;
327 }
328
330 ptrdiff_t pitch, int x, int y)
331 {
335
336 src = &previous[x + y * pitch];
338
339 for (
i = 0;
i < 16;
i++) {
343 }
344 }
345
347 uint8_t *current, uint8_t *previous,
348 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
350 {
354 svq1_pmv *pmv[3];
356
357 /* predict and decode motion vector */
358 pmv[0] = &motion[0];
359 if (y == 0) {
360 pmv[1] =
361 pmv[2] = pmv[0];
362 } else {
363 pmv[1] = &motion[x / 8 + 2];
364 pmv[2] = &motion[x / 8 + 4];
365 }
366
370
371 motion[0].x =
372 motion[x / 8 + 2].x =
373 motion[x / 8 + 3].x =
mv.x;
374 motion[0].y =
375 motion[x / 8 + 2].y =
376 motion[x / 8 + 3].y =
mv.y;
377
380
381 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
383
385
386 return 0;
387 }
388
390 uint8_t *current, uint8_t *previous,
391 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
393 {
397 svq1_pmv *pmv[4];
399
400 /* predict and decode motion vector (0) */
401 pmv[0] = &motion[0];
402 if (y == 0) {
403 pmv[1] =
404 pmv[2] = pmv[0];
405 } else {
406 pmv[1] = &motion[(x / 8) + 2];
407 pmv[2] = &motion[(x / 8) + 4];
408 }
409
413
414 /* predict and decode motion vector (1) */
416 if (y == 0) {
417 pmv[1] =
418 pmv[2] = pmv[0];
419 } else {
420 pmv[1] = &motion[(x / 8) + 3];
421 }
425
426 /* predict and decode motion vector (2) */
427 pmv[1] = &motion[0];
428 pmv[2] = &motion[(x / 8) + 1];
429
433
434 /* predict and decode motion vector (3) */
435 pmv[2] = &motion[(x / 8) + 2];
436 pmv[3] = &motion[(x / 8) + 3];
437
441
442 /* form predictions */
443 for (
i = 0;
i < 4;
i++) {
444 int mvx = pmv[
i]->x + (
i & 1) * 16;
445 int mvy = pmv[
i]->y + (
i >> 1) * 16;
446
447 // FIXME: clipping or padding?
450
451 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
453
455
456 /* select next block */
458 current += 8 * (pitch - 1);
459 else
460 current += 8;
461 }
462
463 return 0;
464 }
465
468 uint8_t *current, uint8_t *previous,
469 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
471 {
472 uint32_t block_type;
474
475 /* get block type */
478
479 /* reset motion vectors */
481 motion[0].x =
482 motion[0].y =
483 motion[x / 8 + 2].x =
484 motion[x / 8 + 2].y =
485 motion[x / 8 + 3].x =
486 motion[x / 8 + 3].y = 0;
487 }
488
489 switch (block_type) {
492 break;
493
497
499 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
500 break;
501 }
503 break;
504
508
510 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
511 break;
512 }
514 break;
515
518 break;
519 }
520
522 }
523
525 {
528
531
532 for (
i = 1;
i <=
out[0];
i++) {
535 }
537 }
538
540 {
543 int frame_size_code;
546 int tempref;
547
548 tempref =
get_bits(bitbuf, 8);
/* temporal_reference */
549 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
550 s->last_tempref = tempref;
551
552 /* frame type */
555 case 0:
557 break;
558 case 2:
560 case 1:
562 break;
563 default:
566 }
567
569 /* unknown fields */
570 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
572
574
575 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
576 (csum == 0) ? "correct" : "incorrect", csum);
577 }
578
579 if ((
s->frame_code ^ 0x10) >= 0x50) {
580 uint8_t msg[257];
581
583
585 "embedded message:\n%s\n", ((char *)msg) + 1);
586 }
587
591
592 /* load frame size */
593 frame_size_code =
get_bits(bitbuf, 3);
594
595 if (frame_size_code == 7) {
596 /* load width, height (12 bits each) */
599
602 } else {
603 /* get width, height from table */
606 }
607 }
608
609 /* unknown fields */
611 skip_bits1(bitbuf);
/* use packet checksum if (1) */
612 skip_bits1(bitbuf);
/* component checksums after image data if (1) */
613
616 }
617
623
626 }
629
632 return 0;
633 }
634
637 {
638 const uint8_t *buf = avpkt->
data;
639 int buf_size = avpkt->
size;
641 uint8_t *current;
644
645 /* initialize bit buffer */
649
650 /* decode frame header */
652
653 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
655
656 /* swap some header bytes (why?) */
657 if (
s->frame_code != 0x20) {
659
660 if (buf_size < 9 * 4) {
663 }
664
666 &
s->pkt_swapped_allocated,
667 buf_size);
670
671 memcpy(
s->pkt_swapped, buf, buf_size);
672 buf =
s->pkt_swapped;
675
676 src = (uint32_t *)(
s->pkt_swapped + 4);
677
678 for (
i = 0;
i < 4;
i++)
680 }
681
684 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
686 }
687
691
696 return buf_size;
697
701
705
706 /* decode y, u and v components */
707 for (
i = 0;
i < 3;
i++) {
712 } else {
714 break;
717 }
718
719 current = cur->
data[
i];
720
722 /* keyframe */
723 for (y = 0; y <
height; y += 16) {
724 for (x = 0; x <
width; x += 16) {
726 linesize);
729 "Error in svq1_decode_block %i (keyframe)\n",
732 }
733 }
734 current += 16 * linesize;
735 }
736 } else {
737 /* delta frame */
738 uint8_t *previous =
s->prev->data[
i];
739 if (!previous ||
740 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
743 }
744
745 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
746
747 for (y = 0; y <
height; y += 16) {
748 for (x = 0; x <
width; x += 16) {
751 previous, linesize,
755 "Error in svq1_decode_delta_block %i\n",
758 }
759 }
760
763
764 current += 16 * linesize;
765 }
766 }
767 }
768
773 }
774
775 *got_frame = 1;
777
779 }
780
782 {
785
789
793
794 for (
int i = 0;
i < 6;
i++) {
803 }
804
808
812 }
813
815 {
818
822
823 s->width = avctx->
width + 3 & ~3;
824 s->height = avctx->
height + 3 & ~3;
826
828
830
831 s->last_tempref = 0xFF;
832
833 return 0;
834 }
835
837 {
839
842 s->pkt_swapped_allocated = 0;
844 s->pmv_allocated = 0;
845
846 return 0;
847 }
848
850 {
852
854 }
855
858 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
867 };