48 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
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
116 #define SVQ1_PROCESS_VECTOR() \
117 for (; level > 0; i++) { \
125 if (!get_bits1(bitbuf)) \
128 list[n++] = list[i]; \
129 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
132 #define SVQ1_ADD_CODEBOOK() \
134 for (j = 0; j < stages; j++) { \
135 n3 = codebook[entries[j]] ^ 0x80808080; \
136 n1 += (n3 & 0xFF00FF00) >> 8; \
137 n2 += n3 & 0x00FF00FF; \
141 if (n1 & 0xFF00FF00) { \
142 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
144 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
145 n1 &= n3 & 0x00FF00FF; \
148 if (n2 & 0xFF00FF00) { \
149 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
151 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
152 n2 &= n3 & 0x00FF00FF; \
155 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
156 codebook = (const uint32_t *)cbook[level]; \
158 bit_cache = get_bits(bitbuf, 4 * stages); \
160 for (j = 0; j < stages; j++) { \
161 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
162 16 * j) << (level + 1); \
164 mean -= stages * 128; \
165 n4 = (mean << 16) + mean;
179 uint32_t n1, n2, n3, n4;
185 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
197 for (y = 0; y <
height; y++)
198 memset(&
dst[y * (pitch / 4)], 0,
width);
202 if ((stages > 0 &&
level >= 4)) {
204 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
213 for (y = 0; y <
height; y++)
218 for (y = 0; y <
height; y++) {
224 dst[x] = n1 << 8 | n2;
235 ptrdiff_t pitch,
int buggy)
246 uint32_t n1, n2, n3, n4;
252 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
266 if ((stages > 0 &&
level >= 4)) {
268 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
279 else if (
mean == 128)
285 for (y = 0; y <
height; y++) {
286 for (x = 0; x <
width / 4; x++) {
289 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
290 n2 = n4 + (n3 & 0x00FF00FF);
293 dst[x] = n1 << 8 | n2;
309 for (
i = 0;
i < 2;
i++) {
330 ptrdiff_t pitch,
int x,
int y)
336 src = &previous[x + y * pitch];
339 for (
i = 0;
i < 16;
i++) {
347 uint8_t *current, uint8_t *previous,
348 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
363 pmv[1] = &motion[x / 8 + 2];
364 pmv[2] = &motion[x / 8 + 4];
372 motion[x / 8 + 2].x =
373 motion[x / 8 + 3].x =
mv.x;
375 motion[x / 8 + 2].y =
376 motion[x / 8 + 3].y =
mv.y;
381 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
390 uint8_t *current, uint8_t *previous,
391 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
406 pmv[1] = &motion[(x / 8) + 2];
407 pmv[2] = &motion[(x / 8) + 4];
420 pmv[1] = &motion[(x / 8) + 3];
428 pmv[2] = &motion[(x / 8) + 1];
435 pmv[2] = &motion[(x / 8) + 2];
436 pmv[3] = &motion[(x / 8) + 3];
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;
451 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
458 current += 8 * (pitch - 1);
468 uint8_t *current, uint8_t *previous,
469 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int 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;
489 switch (block_type) {
499 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
510 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
532 for (
i = 1;
i <=
out[0];
i++) {
549 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
550 s->last_tempref = tempref;
570 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
575 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
576 (csum == 0) ?
"correct" :
"incorrect", csum);
579 if ((
s->frame_code ^ 0x10) >= 0x50) {
585 "embedded message:\n%s\n", ((
char *)msg) + 1);
593 frame_size_code =
get_bits(bitbuf, 3);
595 if (frame_size_code == 7) {
638 const uint8_t *buf = avpkt->
data;
639 int buf_size = avpkt->
size;
653 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
657 if (
s->frame_code != 0x20) {
660 if (buf_size < 9 * 4) {
666 &
s->pkt_swapped_allocated,
671 memcpy(
s->pkt_swapped, buf, buf_size);
672 buf =
s->pkt_swapped;
676 src = (uint32_t *)(
s->pkt_swapped + 4);
678 for (
i = 0;
i < 4;
i++)
684 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
707 for (
i = 0;
i < 3;
i++) {
719 current = cur->
data[
i];
723 for (y = 0; y <
height; y += 16) {
724 for (x = 0; x <
width; x += 16) {
729 "Error in svq1_decode_block %i (keyframe)\n",
734 current += 16 * linesize;
738 uint8_t *previous =
s->prev->data[
i];
740 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
745 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
747 for (y = 0; y <
height; y += 16) {
748 for (x = 0; x <
width; x += 16) {
755 "Error in svq1_decode_delta_block %i\n",
764 current += 16 * linesize;
794 for (
int i = 0;
i < 6;
i++) {
823 s->width = avctx->
width + 3 & ~3;
824 s->height = avctx->
height + 3 & ~3;
831 s->last_tempref = 0xFF;
842 s->pkt_swapped_allocated = 0;
844 s->pmv_allocated = 0;
858 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),