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
37
46
47 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
54
55 /* motion vector (prediction) */
59 } svq1_pmv;
60
65
68
71
75 int nonref;
// 1 if the current frame won't be referenced
76
79
81 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
82 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
83 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
84 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
85 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
86 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
87 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
88 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
89 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
90 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
91 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
92 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
93 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
94 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
95 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
96 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
97 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
98 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
99 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
100 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
101 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
102 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
103 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
104 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
105 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
106 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
107 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
108 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
109 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
110 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
111 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
112 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
113 };
114
115 #define SVQ1_PROCESS_VECTOR() \
116 for (; level > 0; i++) { \
117 /* process next depth */ \
118 if (i == m) { \
119 m = n; \
120 if (--level == 0) \
121 break; \
122 } \
123 /* divide block if next bit set */ \
124 if (!get_bits1(bitbuf)) \
125 break; \
126 /* add child nodes */ \
127 list[n++] = list[i]; \
128 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
129 }
130
131 #define SVQ1_ADD_CODEBOOK() \
132 /* add codebook entries to vector */ \
133 for (j = 0; j < stages; j++) { \
134 n3 = codebook[entries[j]] ^ 0x80808080; \
135 n1 += (n3 & 0xFF00FF00) >> 8; \
136 n2 += n3 & 0x00FF00FF; \
137 } \
138 \
139 /* clip to [0..255] */ \
140 if (n1 & 0xFF00FF00) { \
141 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
142 n1 += 0x7F007F00; \
143 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
144 n1 &= n3 & 0x00FF00FF; \
145 } \
146 \
147 if (n2 & 0xFF00FF00) { \
148 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
149 n2 += 0x7F007F00; \
150 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
151 n2 &= n3 & 0x00FF00FF; \
152 }
153
154 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
155 codebook = (const uint32_t *)cbook[level]; \
156 if (stages > 0) \
157 bit_cache = get_bits(bitbuf, 4 * stages); \
158 /* calculate codebook entries for this vector */ \
159 for (j = 0; j < stages; j++) { \
160 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
161 16 * j) << (level + 1); \
162 } \
163 mean -= stages * 128; \
164 n4 = (mean << 16) + mean;
165
167 ptrdiff_t pitch)
168 {
169 uint32_t bit_cache;
171 uint32_t *dst;
173 int entries[6];
175 int stages;
178 uint32_t n1, n2, n3, n4;
179
180 /* initialize list for breadth first processing of vectors */
182
183 /* recursively process vector */
184 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
186
187 /* destination address and vector size */
188 dst = (uint32_t *)
list[
i];
191
192 /* get number of stages (-1 skips vector, 0 for mean only) */
194
195 if (stages == -1) {
196 for (y = 0; y <
height; y++)
197 memset(&dst[y * (pitch / 4)], 0,
width);
198 continue; /* skip vector */
199 }
200
201 if ((stages > 0 &&
level >= 4)) {
203 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
206 }
208
210
211 if (stages == 0) {
212 for (y = 0; y <
height; y++)
213 memset(&dst[y * (pitch / 4)],
mean,
width);
214 } else {
216
217 for (y = 0; y <
height; y++) {
219 n1 = n4;
220 n2 = n4;
222 /* store result */
223 dst[x] = n1 << 8 | n2;
224 }
225 dst += pitch / 4;
226 }
227 }
228 }
229
230 return 0;
231 }
232
234 ptrdiff_t pitch, int buggy)
235 {
236 uint32_t bit_cache;
238 uint32_t *dst;
240 int entries[6];
242 int stages;
245 uint32_t n1, n2, n3, n4;
246
247 /* initialize list for breadth first processing of vectors */
249
250 /* recursively process vector */
251 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
253
254 /* destination address and vector size */
255 dst = (uint32_t *)
list[
i];
258
259 /* get number of stages (-1 skips vector, 0 for mean only) */
261
262 if (stages == -1)
263 continue; /* skip vector */
264
265 if ((stages > 0 &&
level >= 4)) {
267 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
270 }
272
274
275 if (buggy) {
278 else if (
mean == 128)
280 }
281
283
284 for (y = 0; y <
height; y++) {
285 for (x = 0; x <
width / 4; x++) {
286 n3 = dst[x];
287 /* add mean value to vector */
288 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
289 n2 = n4 + (n3 & 0x00FF00FF);
291 /* store result */
292 dst[x] = n1 << 8 | n2;
295 }
296 dst += pitch / 4;
297 }
298 }
299 return 0;
300 }
301
303 svq1_pmv **pmv)
304 {
307
308 for (
i = 0;
i < 2;
i++) {
309 /* get motion code */
316 }
317
318 /* add median of motion vector predictors and clip result */
321 else
323 }
324
325 return 0;
326 }
327
329 ptrdiff_t pitch, int x, int y)
330 {
332 uint8_t *dst;
334
335 src = &previous[x + y * pitch];
336 dst = current;
337
338 for (
i = 0;
i < 16;
i++) {
339 memcpy(dst,
src, 16);
341 dst += pitch;
342 }
343 }
344
346 uint8_t *current, uint8_t *previous,
347 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
349 {
351 uint8_t *dst;
353 svq1_pmv *pmv[3];
355
356 /* predict and decode motion vector */
357 pmv[0] = &motion[0];
358 if (y == 0) {
359 pmv[1] =
360 pmv[2] = pmv[0];
361 } else {
362 pmv[1] = &motion[x / 8 + 2];
363 pmv[2] = &motion[x / 8 + 4];
364 }
365
369
370 motion[0].x =
371 motion[x / 8 + 2].x =
372 motion[x / 8 + 3].x =
mv.x;
373 motion[0].y =
374 motion[x / 8 + 2].y =
375 motion[x / 8 + 3].y =
mv.y;
376
379
380 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
381 dst = current;
382
384
385 return 0;
386 }
387
389 uint8_t *current, uint8_t *previous,
390 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
392 {
394 uint8_t *dst;
396 svq1_pmv *pmv[4];
398
399 /* predict and decode motion vector (0) */
400 pmv[0] = &motion[0];
401 if (y == 0) {
402 pmv[1] =
403 pmv[2] = pmv[0];
404 } else {
405 pmv[1] = &motion[(x / 8) + 2];
406 pmv[2] = &motion[(x / 8) + 4];
407 }
408
412
413 /* predict and decode motion vector (1) */
415 if (y == 0) {
416 pmv[1] =
417 pmv[2] = pmv[0];
418 } else {
419 pmv[1] = &motion[(x / 8) + 3];
420 }
424
425 /* predict and decode motion vector (2) */
426 pmv[1] = &motion[0];
427 pmv[2] = &motion[(x / 8) + 1];
428
432
433 /* predict and decode motion vector (3) */
434 pmv[2] = &motion[(x / 8) + 2];
435 pmv[3] = &motion[(x / 8) + 3];
436
440
441 /* form predictions */
442 for (
i = 0;
i < 4;
i++) {
443 int mvx = pmv[
i]->x + (
i & 1) * 16;
444 int mvy = pmv[
i]->y + (
i >> 1) * 16;
445
446 // FIXME: clipping or padding?
449
450 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
451 dst = current;
452
454
455 /* select next block */
457 current += 8 * (pitch - 1);
458 else
459 current += 8;
460 }
461
462 return 0;
463 }
464
467 uint8_t *current, uint8_t *previous,
468 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
470 {
471 uint32_t block_type;
473
474 /* get block type */
477
478 /* reset motion vectors */
480 motion[0].x =
481 motion[0].y =
482 motion[x / 8 + 2].x =
483 motion[x / 8 + 2].y =
484 motion[x / 8 + 3].x =
485 motion[x / 8 + 3].y = 0;
486 }
487
488 switch (block_type) {
491 break;
492
496
498 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
499 break;
500 }
502 break;
503
507
509 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
510 break;
511 }
513 break;
514
517 break;
518 }
519
521 }
522
524 {
527
530
531 for (
i = 1;
i <=
out[0];
i++) {
534 }
536 }
537
539 {
542 int frame_size_code;
545 int tempref;
546
547 tempref =
get_bits(bitbuf, 8);
/* temporal_reference */
548 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
549 s->last_tempref = tempref;
550
551 /* frame type */
554 case 0:
556 break;
557 case 2:
559 case 1:
561 break;
562 default:
565 }
566
568 /* unknown fields */
569 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
571
573
574 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
575 (csum == 0) ? "correct" : "incorrect", csum);
576 }
577
578 if ((
s->frame_code ^ 0x10) >= 0x50) {
579 uint8_t msg[257];
580
582
584 "embedded message:\n%s\n", ((char *)msg) + 1);
585 }
586
590
591 /* load frame size */
592 frame_size_code =
get_bits(bitbuf, 3);
593
594 if (frame_size_code == 7) {
595 /* load width, height (12 bits each) */
598
601 } else {
602 /* get width, height from table */
605 }
606 }
607
608 /* unknown fields */
610 skip_bits1(bitbuf);
/* use packet checksum if (1) */
611 skip_bits1(bitbuf);
/* component checksums after image data if (1) */
612
615 }
616
622
625 }
628
631 return 0;
632 }
633
636 {
637 const uint8_t *buf = avpkt->
data;
638 int buf_size = avpkt->
size;
640 uint8_t *current;
643
644 /* initialize bit buffer */
648
649 /* decode frame header */
651
652 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
654
655 /* swap some header bytes (why?) */
656 if (
s->frame_code != 0x20) {
658
659 if (buf_size < 9 * 4) {
662 }
663
665 &
s->pkt_swapped_allocated,
666 buf_size);
669
670 memcpy(
s->pkt_swapped, buf, buf_size);
671 buf =
s->pkt_swapped;
674
675 src = (uint32_t *)(
s->pkt_swapped + 4);
676
677 for (
i = 0;
i < 4;
i++)
679 }
680
683 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
685 }
686
690
695 return buf_size;
696
700
704
705 /* decode y, u and v components */
706 for (
i = 0;
i < 3;
i++) {
711 } else {
713 break;
716 }
717
718 current = cur->
data[
i];
719
721 /* keyframe */
722 for (y = 0; y <
height; y += 16) {
723 for (x = 0; x <
width; x += 16) {
725 linesize);
728 "Error in svq1_decode_block %i (keyframe)\n",
731 }
732 }
733 current += 16 * linesize;
734 }
735 } else {
736 /* delta frame */
737 uint8_t *previous =
s->prev->data[
i];
738 if (!previous ||
739 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
742 }
743
744 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
745
746 for (y = 0; y <
height; y += 16) {
747 for (x = 0; x <
width; x += 16) {
750 previous, linesize,
754 "Error in svq1_decode_delta_block %i\n",
757 }
758 }
759
762
763 current += 16 * linesize;
764 }
765 }
766 }
767
772 }
773
774 *got_frame = 1;
776
778 }
779
781 {
784
788
792
793 for (
int i = 0;
i < 6;
i++) {
802 }
803
807
811 }
812
814 {
817
821
822 s->width = avctx->
width + 3 & ~3;
823 s->height = avctx->
height + 3 & ~3;
825
827
829
830 s->last_tempref = 0xFF;
831
832 return 0;
833 }
834
836 {
838
841 s->pkt_swapped_allocated = 0;
843 s->pmv_allocated = 0;
844
845 return 0;
846 }
847
849 {
851
853 }
854
857 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
866 };