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++) {
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;
293 }
294 dst += pitch / 4;
295 }
296 }
297 return 0;
298 }
299
301 svq1_pmv **pmv)
302 {
305
306 for (
i = 0;
i < 2;
i++) {
307 /* get motion code */
314 }
315
316 /* add median of motion vector predictors and clip result */
319 else
321 }
322
323 return 0;
324 }
325
327 ptrdiff_t pitch, int x, int y)
328 {
330 uint8_t *dst;
332
333 src = &previous[x + y * pitch];
334 dst = current;
335
336 for (
i = 0;
i < 16;
i++) {
337 memcpy(dst,
src, 16);
339 dst += pitch;
340 }
341 }
342
344 uint8_t *current, uint8_t *previous,
345 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
347 {
349 uint8_t *dst;
351 svq1_pmv *pmv[3];
353
354 /* predict and decode motion vector */
355 pmv[0] = &motion[0];
356 if (y == 0) {
357 pmv[1] =
358 pmv[2] = pmv[0];
359 } else {
360 pmv[1] = &motion[x / 8 + 2];
361 pmv[2] = &motion[x / 8 + 4];
362 }
363
367
368 motion[0].x =
369 motion[x / 8 + 2].x =
370 motion[x / 8 + 3].x =
mv.x;
371 motion[0].y =
372 motion[x / 8 + 2].y =
373 motion[x / 8 + 3].y =
mv.y;
374
377
378 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
379 dst = current;
380
382
383 return 0;
384 }
385
387 uint8_t *current, uint8_t *previous,
388 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
390 {
392 uint8_t *dst;
394 svq1_pmv *pmv[4];
396
397 /* predict and decode motion vector (0) */
398 pmv[0] = &motion[0];
399 if (y == 0) {
400 pmv[1] =
401 pmv[2] = pmv[0];
402 } else {
403 pmv[1] = &motion[(x / 8) + 2];
404 pmv[2] = &motion[(x / 8) + 4];
405 }
406
410
411 /* predict and decode motion vector (1) */
413 if (y == 0) {
414 pmv[1] =
415 pmv[2] = pmv[0];
416 } else {
417 pmv[1] = &motion[(x / 8) + 3];
418 }
422
423 /* predict and decode motion vector (2) */
424 pmv[1] = &motion[0];
425 pmv[2] = &motion[(x / 8) + 1];
426
430
431 /* predict and decode motion vector (3) */
432 pmv[2] = &motion[(x / 8) + 2];
433 pmv[3] = &motion[(x / 8) + 3];
434
438
439 /* form predictions */
440 for (
i = 0;
i < 4;
i++) {
441 int mvx = pmv[
i]->x + (
i & 1) * 16;
442 int mvy = pmv[
i]->y + (
i >> 1) * 16;
443
444 // FIXME: clipping or padding?
447
448 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
449 dst = current;
450
452
453 /* select next block */
455 current += 8 * (pitch - 1);
456 else
457 current += 8;
458 }
459
460 return 0;
461 }
462
465 uint8_t *current, uint8_t *previous,
466 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
468 {
469 uint32_t block_type;
471
472 /* get block type */
475
476 /* reset motion vectors */
478 motion[0].x =
479 motion[0].y =
480 motion[x / 8 + 2].x =
481 motion[x / 8 + 2].y =
482 motion[x / 8 + 3].x =
483 motion[x / 8 + 3].y = 0;
484 }
485
486 switch (block_type) {
489 break;
490
494
496 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
497 break;
498 }
500 break;
501
505
507 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
508 break;
509 }
511 break;
512
515 break;
516 }
517
519 }
520
522 {
525
528
529 for (
i = 1;
i <=
out[0];
i++) {
532 }
534 }
535
537 {
540 int frame_size_code;
543 int tempref;
544
545 tempref =
get_bits(bitbuf, 8);
/* temporal_reference */
546 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
547 s->last_tempref = tempref;
548
549 /* frame type */
552 case 0:
554 break;
555 case 2:
557 case 1:
559 break;
560 default:
563 }
564
566 /* unknown fields */
567 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
569
571
572 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
573 (csum == 0) ? "correct" : "incorrect", csum);
574 }
575
576 if ((
s->frame_code ^ 0x10) >= 0x50) {
577 uint8_t msg[257];
578
580
582 "embedded message:\n%s\n", ((char *)msg) + 1);
583 }
584
588
589 /* load frame size */
590 frame_size_code =
get_bits(bitbuf, 3);
591
592 if (frame_size_code == 7) {
593 /* load width, height (12 bits each) */
596
599 } else {
600 /* get width, height from table */
603 }
604 }
605
606 /* unknown fields */
608 skip_bits1(bitbuf);
/* use packet checksum if (1) */
609 skip_bits1(bitbuf);
/* component checksums after image data if (1) */
610
613 }
614
620
623 }
626
629 return 0;
630 }
631
634 {
635 const uint8_t *buf = avpkt->
data;
636 int buf_size = avpkt->
size;
638 uint8_t *current;
641
642 /* initialize bit buffer */
646
647 /* decode frame header */
649
650 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
652
653 /* swap some header bytes (why?) */
654 if (
s->frame_code != 0x20) {
656
657 if (buf_size < 9 * 4) {
660 }
661
663 &
s->pkt_swapped_allocated,
664 buf_size);
667
668 memcpy(
s->pkt_swapped, buf, buf_size);
669 buf =
s->pkt_swapped;
672
673 src = (uint32_t *)(
s->pkt_swapped + 4);
674
675 for (
i = 0;
i < 4;
i++)
677 }
678
681 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
683 }
684
688
693 return buf_size;
694
698
702
703 /* decode y, u and v components */
704 for (
i = 0;
i < 3;
i++) {
709 } else {
711 break;
714 }
715
716 current = cur->
data[
i];
717
719 /* keyframe */
720 for (y = 0; y <
height; y += 16) {
721 for (x = 0; x <
width; x += 16) {
723 linesize);
726 "Error in svq1_decode_block %i (keyframe)\n",
729 }
730 }
731 current += 16 * linesize;
732 }
733 } else {
734 /* delta frame */
735 uint8_t *previous =
s->prev->data[
i];
736 if (!previous ||
737 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
740 }
741
742 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
743
744 for (y = 0; y <
height; y += 16) {
745 for (x = 0; x <
width; x += 16) {
748 previous, linesize,
752 "Error in svq1_decode_delta_block %i\n",
755 }
756 }
757
760
761 current += 16 * linesize;
762 }
763 }
764 }
765
771 }
772
773 *got_frame = 1;
775
777 }
778
780 {
784
788
789 for (
int i = 0,
offset = 0;
i < 6;
i++) {
790 static const uint8_t
sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
791 { 10, 10, 14, 14, 14, 16 } };
807 }
808
812
816 }
817
819 {
822
826
827 s->width = avctx->
width + 3 & ~3;
828 s->height = avctx->
height + 3 & ~3;
830
832
834
835 s->last_tempref = 0xFF;
836
837 return 0;
838 }
839
841 {
843
846 s->pkt_swapped_allocated = 0;
848 s->pmv_allocated = 0;
849
850 return 0;
851 }
852
854 {
856
858 }
859
862 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
873 };