49 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
83 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
84 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
85 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
86 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
87 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
88 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
89 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
90 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
91 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
92 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
93 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
94 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
95 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
96 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
97 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
98 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
99 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
100 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
101 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
102 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
103 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
104 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
105 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
106 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
107 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
108 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
109 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
110 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
111 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
112 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
113 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
114 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
117 #define SVQ1_PROCESS_VECTOR() \
118 for (; level > 0; i++) { \
126 if (!get_bits1(bitbuf)) \
129 list[n++] = list[i]; \
130 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
133 #define SVQ1_ADD_CODEBOOK() \
135 for (j = 0; j < stages; j++) { \
136 n3 = codebook[entries[j]] ^ 0x80808080; \
137 n1 += (n3 & 0xFF00FF00) >> 8; \
138 n2 += n3 & 0x00FF00FF; \
142 if (n1 & 0xFF00FF00) { \
143 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
145 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
146 n1 &= n3 & 0x00FF00FF; \
149 if (n2 & 0xFF00FF00) { \
150 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
152 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
153 n2 &= n3 & 0x00FF00FF; \
156 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
157 codebook = (const uint32_t *)cbook[level]; \
159 bit_cache = get_bits(bitbuf, 4 * stages); \
161 for (j = 0; j < stages; j++) { \
162 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
163 16 * j) << (level + 1); \
165 mean -= stages * 128; \
166 n4 = (mean << 16) + mean;
180 uint32_t n1, n2, n3, n4;
186 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
198 for (y = 0; y <
height; y++)
199 memset(&
dst[y * (pitch / 4)], 0,
width);
203 if ((stages > 0 &&
level >= 4)) {
205 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
214 for (y = 0; y <
height; y++)
219 for (y = 0; y <
height; y++) {
225 dst[x] = n1 << 8 | n2;
236 ptrdiff_t pitch,
int buggy)
247 uint32_t n1, n2, n3, n4;
253 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
267 if ((stages > 0 &&
level >= 4)) {
269 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
280 else if (
mean == 128)
286 for (y = 0; y <
height; y++) {
287 for (x = 0; x <
width / 4; x++) {
290 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
291 n2 = n4 + (n3 & 0x00FF00FF);
294 dst[x] = n1 << 8 | n2;
310 for (
i = 0;
i < 2;
i++) {
331 ptrdiff_t pitch,
int x,
int y)
337 src = &previous[x + y * pitch];
340 for (
i = 0;
i < 16;
i++) {
348 uint8_t *current, uint8_t *previous,
349 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
364 pmv[1] = &motion[x / 8 + 2];
365 pmv[2] = &motion[x / 8 + 4];
373 motion[x / 8 + 2].x =
374 motion[x / 8 + 3].x =
mv.x;
376 motion[x / 8 + 2].y =
377 motion[x / 8 + 3].y =
mv.y;
382 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
391 uint8_t *current, uint8_t *previous,
392 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
407 pmv[1] = &motion[(x / 8) + 2];
408 pmv[2] = &motion[(x / 8) + 4];
421 pmv[1] = &motion[(x / 8) + 3];
429 pmv[2] = &motion[(x / 8) + 1];
436 pmv[2] = &motion[(x / 8) + 2];
437 pmv[3] = &motion[(x / 8) + 3];
444 for (
i = 0;
i < 4;
i++) {
445 int mvx = pmv[
i]->x + (
i & 1) * 16;
446 int mvy = pmv[
i]->y + (
i >> 1) * 16;
452 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
459 current += 8 * (pitch - 1);
469 uint8_t *current, uint8_t *previous,
470 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
484 motion[x / 8 + 2].x =
485 motion[x / 8 + 2].y =
486 motion[x / 8 + 3].x =
487 motion[x / 8 + 3].y = 0;
490 switch (block_type) {
500 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
511 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
533 for (
i = 1;
i <=
out[0];
i++) {
550 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
551 s->last_tempref = tempref;
571 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
576 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
577 (csum == 0) ?
"correct" :
"incorrect", csum);
580 if ((
s->frame_code ^ 0x10) >= 0x50) {
586 "embedded message:\n%s\n", ((
char *)msg) + 1);
594 frame_size_code =
get_bits(bitbuf, 3);
596 if (frame_size_code == 7) {
639 const uint8_t *buf = avpkt->
data;
640 int buf_size = avpkt->
size;
654 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
658 if (
s->frame_code != 0x20) {
661 if (buf_size < 9 * 4) {
667 &
s->pkt_swapped_allocated,
672 memcpy(
s->pkt_swapped, buf, buf_size);
673 buf =
s->pkt_swapped;
677 src = (uint32_t *)(
s->pkt_swapped + 4);
679 for (
i = 0;
i < 4;
i++)
685 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
708 for (
i = 0;
i < 3;
i++) {
720 current = cur->
data[
i];
724 for (y = 0; y <
height; y += 16) {
725 for (x = 0; x <
width; x += 16) {
730 "Error in svq1_decode_block %i (keyframe)\n",
735 current += 16 * linesize;
739 uint8_t *previous =
s->prev->data[
i];
741 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
746 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
748 for (y = 0; y <
height; y += 16) {
749 for (x = 0; x <
width; x += 16) {
756 "Error in svq1_decode_delta_block %i\n",
765 current += 16 * linesize;
795 for (
int i = 0;
i < 6;
i++) {
824 s->width = avctx->
width + 3 & ~3;
825 s->height = avctx->
height + 3 & ~3;
832 s->last_tempref = 0xFF;
843 s->pkt_swapped_allocated = 0;
845 s->pmv_allocated = 0;
859 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),