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
42
49
50 /* motion vector (prediction) */
51 typedef struct svq1_pmv_s {
55
60
63
67 int nonref;
// 1 if the current frame won't be referenced
69
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
157 int pitch)
158 {
159 uint32_t bit_cache;
161 uint32_t *dst;
162 const uint32_t *codebook;
163 int entries[6];
165 int mean, stages;
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)) {
192 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
193 stages, level);
195 }
197
199
200 if (stages == 0) {
201 for (y = 0; y <
height; y++)
202 memset(&dst[y * (pitch / 4)], mean, width);
203 } else {
205
206 for (y = 0; y <
height; y++) {
207 for (x = 0; x < width / 4; x++, codebook++) {
208 n1 = n4;
209 n2 = n4;
211 /* store result */
212 dst[x] = n1 << 8 | n2;
213 }
214 dst += pitch / 4;
215 }
216 }
217 }
218
219 return 0;
220 }
221
223 int pitch)
224 {
225 uint32_t bit_cache;
227 uint32_t *dst;
228 const uint32_t *codebook;
229 int entries[6];
231 int mean, stages;
233 uint32_t n1, n2, n3, n4;
234
235 /* initialize list for breadth first processing of vectors */
236 list[0] = pixels;
237
238 /* recursively process vector */
239 for (i = 0, m = 1, n = 1, level = 5; i <
n; i++) {
241
242 /* destination address and vector size */
243 dst = (uint32_t *)list[i];
244 width = 1 << ((4 +
level) / 2);
245 height = 1 << ((3 +
level) / 2);
246
247 /* get number of stages (-1 skips vector, 0 for mean only) */
248 stages =
get_vlc2(bitbuf, svq1_inter_multistage[level].
table, 3, 2) - 1;
249
250 if (stages == -1)
251 continue; /* skip vector */
252
253 if ((stages > 0 && level >= 4)) {
255 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
256 stages, level);
258 }
260
262
264
265 for (y = 0; y <
height; y++) {
266 for (x = 0; x < width / 4; x++, codebook++) {
267 n3 = dst[x];
268 /* add mean value to vector */
269 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
270 n2 = n4 + (n3 & 0x00FF00FF);
272 /* store result */
273 dst[x] = n1 << 8 | n2;
274 }
275 dst += pitch / 4;
276 }
277 }
278 return 0;
279 }
280
283 {
285 int i;
286
287 for (i = 0; i < 2; i++) {
288 /* get motion code */
290 if (diff < 0)
292 else if (diff) {
295 }
296
297 /* add median of motion vector predictors and clip result */
298 if (i == 1)
300 else
302 }
303
304 return 0;
305 }
306
308 int pitch,
int x,
int y)
309 {
312 int i;
313
314 src = &previous[x + y * pitch];
315 dst = current;
316
317 for (i = 0; i < 16; i++) {
318 memcpy(dst, src, 16);
319 src += pitch;
320 dst += pitch;
321 }
322 }
323
326 int pitch,
svq1_pmv *motion,
int x,
int y,
328 {
333 int result;
334
335 /* predict and decode motion vector */
336 pmv[0] = &motion[0];
337 if (y == 0) {
338 pmv[1] =
339 pmv[2] = pmv[0];
340 } else {
341 pmv[1] = &motion[x / 8 + 2];
342 pmv[2] = &motion[x / 8 + 4];
343 }
344
346 if (result)
347 return result;
348
350 motion[x / 8 + 2].
x =
351 motion[x / 8 + 3].
x = mv.
x;
353 motion[x / 8 + 2].
y =
354 motion[x / 8 + 3].
y = mv.
y;
355
356 mv.
x = av_clip(mv.
x, -2 * x, 2 * (width - x - 16));
357 mv.
y = av_clip(mv.
y, -2 * y, 2 * (height - y - 16));
358
359 src = &previous[(x + (mv.
x >> 1)) + (y + (mv.
y >> 1)) * pitch];
360 dst = current;
361
363
364 return 0;
365 }
366
369 int pitch,
svq1_pmv *motion,
int x,
int y,
371 {
376 int i, result;
377
378 /* predict and decode motion vector (0) */
379 pmv[0] = &motion[0];
380 if (y == 0) {
381 pmv[1] =
382 pmv[2] = pmv[0];
383 } else {
384 pmv[1] = &motion[(x / 8) + 2];
385 pmv[2] = &motion[(x / 8) + 4];
386 }
387
389 if (result)
390 return result;
391
392 /* predict and decode motion vector (1) */
394 if (y == 0) {
395 pmv[1] =
396 pmv[2] = pmv[0];
397 } else {
398 pmv[1] = &motion[(x / 8) + 3];
399 }
401 if (result)
402 return result;
403
404 /* predict and decode motion vector (2) */
405 pmv[1] = &motion[0];
406 pmv[2] = &motion[(x / 8) + 1];
407
409 if (result)
410 return result;
411
412 /* predict and decode motion vector (3) */
413 pmv[2] = &motion[(x / 8) + 2];
414 pmv[3] = &motion[(x / 8) + 3];
415
417 if (result)
418 return result;
419
420 /* form predictions */
421 for (i = 0; i < 4; i++) {
422 int mvx = pmv[i]->x + (i & 1) * 16;
423 int mvy = pmv[i]->y + (i >> 1) * 16;
424
425 // FIXME: clipping or padding?
426 mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
427 mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
428
429 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
430 dst = current;
431
432 hdsp->
put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
433
434 /* select next block */
435 if (i & 1)
436 current += 8 * (pitch - 1);
437 else
438 current += 8;
439 }
440
441 return 0;
442 }
443
447 int pitch,
svq1_pmv *motion,
int x,
int y,
449 {
450 uint32_t block_type;
451 int result = 0;
452
453 /* get block type */
455
456 /* reset motion vectors */
460 motion[x / 8 + 2].
x =
461 motion[x / 8 + 2].
y =
462 motion[x / 8 + 3].
x =
463 motion[x / 8 + 3].
y = 0;
464 }
465
466 switch (block_type) {
469 break;
470
473 pitch, motion, x, y, width, height);
474
475 if (result != 0) {
476 av_dlog(avctx,
"Error in svq1_motion_inter_block %i\n", result);
477 break;
478 }
480 break;
481
484 pitch, motion, x, y, width, height);
485
486 if (result != 0) {
487 av_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n", result);
488 break;
489 }
491 break;
492
495 break;
496 }
497
498 return result;
499 }
500
502 {
504 int i;
505
508
509 for (i = 1; i <= out[0]; i++) {
512 }
513 out[i] = 0;
514 }
515
517 {
520 int frame_size_code;
523
524 skip_bits(bitbuf, 8);
/* temporal_reference */
525
526 /* frame type */
529 case 0:
531 break;
532 case 2:
534 case 1:
536 break;
537 default:
540 }
541
543 /* unknown fields */
546
549 csum);
550
551 av_dlog(avctx,
"%s checksum (%02x) for packet data\n",
552 (csum == 0) ? "correct" : "incorrect", csum);
553 }
554
557
559
561 "embedded message:\n%s\n", ((char *)msg) + 1);
562 }
563
567
568 /* load frame size */
569 frame_size_code =
get_bits(bitbuf, 3);
570
571 if (frame_size_code == 7) {
572 /* load width, height (12 bits each) */
575
576 if (!width || !height)
578 } else {
579 /* get width, height from table */
582 }
583 }
584
585 /* unknown fields */
587 skip_bits1(bitbuf);
/* use packet checksum if (1) */
588 skip_bits1(bitbuf);
/* component checksums after image data if (1) */
589
592 }
593
599
602 }
603
606 return 0;
607 }
608
611 {
613 int buf_size = avpkt->
size;
619
620 /* initialize bit buffer */
622
623 /* decode frame header */
625
628
629 /* swap some header bytes (why?) */
632
633 if (buf_size < 9 * 4) {
636 }
637
640 buf_size);
643
648
650
651 if (buf_size < 36)
653
654 for (i = 0; i < 4; i++)
655 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
656 }
657
659 if (result != 0) {
660 av_dlog(avctx,
"Error in svq1_decode_frame_header %i\n", result);
661 return result;
662 }
663
665 if (result < 0)
666 return result;
667
672 return buf_size;
673
675 if (result < 0)
676 return result;
677
679 if (!pmv)
681
682 /* decode y, u and v components */
683 for (i = 0; i < 3; i++) {
685 if (i == 0) {
688 } else {
690 break;
693 }
694
695 current = cur->
data[i];
696
698 /* keyframe */
699 for (y = 0; y <
height; y += 16) {
700 for (x = 0; x <
width; x += 16) {
702 linesize);
703 if (result) {
705 "Error in svq1_decode_block %i (keyframe)\n",
706 result);
707 goto err;
708 }
709 }
710 current += 16 * linesize;
711 }
712 } else {
713 /* delta frame */
715 if (!previous ||
719 goto err;
720 }
721
722 memset(pmv, 0, ((width / 8) + 3) *
sizeof(
svq1_pmv));
723
724 for (y = 0; y <
height; y += 16) {
725 for (x = 0; x <
width; x += 16) {
728 previous, linesize,
729 pmv, x, y, width, height);
730 if (result != 0) {
732 "Error in svq1_decode_delta_block %i\n",
733 result);
734 goto err;
735 }
736 }
737
740
741 current += 16 * linesize;
742 }
743 }
744 }
745
749 if (result < 0)
750 goto err;
751 }
752
753 *got_frame = 1;
754 result = buf_size;
755
756 err:
758 return result;
759 }
760
762 {
764 int i;
766
770
774
776
780
784
785 for (i = 0; i < 6; i++) {
786 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
787 { 10, 10, 14, 14, 14, 16 } };
791 offset += sizes[0][i];
792 init_vlc(&svq1_intra_multistage[i], 3, 8,
798 offset += sizes[1][i];
799 init_vlc(&svq1_inter_multistage[i], 3, 8,
803 }
804
808
812
813 return 0;
814 }
815
817 {
819
823
824 return 0;
825 }
826
828 {
830
832 }
833
847 };