47 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
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
115 #define SVQ1_PROCESS_VECTOR() \
116 for (; level > 0; i++) { \
124 if (!get_bits1(bitbuf)) \
127 list[n++] = list[i]; \
128 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
131 #define SVQ1_ADD_CODEBOOK() \
133 for (j = 0; j < stages; j++) { \
134 n3 = codebook[entries[j]] ^ 0x80808080; \
135 n1 += (n3 & 0xFF00FF00) >> 8; \
136 n2 += n3 & 0x00FF00FF; \
140 if (n1 & 0xFF00FF00) { \
141 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
143 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
144 n1 &= n3 & 0x00FF00FF; \
147 if (n2 & 0xFF00FF00) { \
148 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
150 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
151 n2 &= n3 & 0x00FF00FF; \
154 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
155 codebook = (const uint32_t *)cbook[level]; \
157 bit_cache = get_bits(bitbuf, 4 * stages); \
159 for (j = 0; j < stages; j++) { \
160 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
161 16 * j) << (level + 1); \
163 mean -= stages * 128; \
164 n4 = (mean << 16) + mean;
178 uint32_t n1, n2, n3, n4;
184 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
188 dst = (uint32_t *)
list[
i];
196 for (y = 0; y <
height; y++)
197 memset(&dst[y * (pitch / 4)], 0,
width);
201 if ((stages > 0 &&
level >= 4)) {
203 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
212 for (y = 0; y <
height; y++)
213 memset(&dst[y * (pitch / 4)],
mean,
width);
217 for (y = 0; y <
height; y++) {
223 dst[x] = n1 << 8 | n2;
234 ptrdiff_t pitch,
int buggy)
245 uint32_t n1, n2, n3, n4;
251 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
255 dst = (uint32_t *)
list[
i];
265 if ((stages > 0 &&
level >= 4)) {
267 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
278 else if (
mean == 128)
284 for (y = 0; y <
height; y++) {
285 for (x = 0; x <
width / 4; x++) {
288 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
289 n2 = n4 + (n3 & 0x00FF00FF);
292 dst[x] = n1 << 8 | n2;
308 for (
i = 0;
i < 2;
i++) {
329 ptrdiff_t pitch,
int x,
int y)
335 src = &previous[x + y * pitch];
338 for (
i = 0;
i < 16;
i++) {
339 memcpy(dst,
src, 16);
346 uint8_t *current, uint8_t *previous,
347 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
362 pmv[1] = &motion[x / 8 + 2];
363 pmv[2] = &motion[x / 8 + 4];
371 motion[x / 8 + 2].x =
372 motion[x / 8 + 3].x =
mv.x;
374 motion[x / 8 + 2].y =
375 motion[x / 8 + 3].y =
mv.y;
380 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
389 uint8_t *current, uint8_t *previous,
390 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
405 pmv[1] = &motion[(x / 8) + 2];
406 pmv[2] = &motion[(x / 8) + 4];
419 pmv[1] = &motion[(x / 8) + 3];
427 pmv[2] = &motion[(x / 8) + 1];
434 pmv[2] = &motion[(x / 8) + 2];
435 pmv[3] = &motion[(x / 8) + 3];
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;
450 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
457 current += 8 * (pitch - 1);
467 uint8_t *current, uint8_t *previous,
468 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int 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;
488 switch (block_type) {
498 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
509 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
531 for (
i = 1;
i <=
out[0];
i++) {
548 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
549 s->last_tempref = tempref;
569 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
574 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
575 (csum == 0) ?
"correct" :
"incorrect", csum);
578 if ((
s->frame_code ^ 0x10) >= 0x50) {
584 "embedded message:\n%s\n", ((
char *)msg) + 1);
592 frame_size_code =
get_bits(bitbuf, 3);
594 if (frame_size_code == 7) {
637 const uint8_t *buf = avpkt->
data;
638 int buf_size = avpkt->
size;
652 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
656 if (
s->frame_code != 0x20) {
659 if (buf_size < 9 * 4) {
665 &
s->pkt_swapped_allocated,
670 memcpy(
s->pkt_swapped, buf, buf_size);
671 buf =
s->pkt_swapped;
675 src = (uint32_t *)(
s->pkt_swapped + 4);
677 for (
i = 0;
i < 4;
i++)
683 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
706 for (
i = 0;
i < 3;
i++) {
718 current = cur->
data[
i];
722 for (y = 0; y <
height; y += 16) {
723 for (x = 0; x <
width; x += 16) {
728 "Error in svq1_decode_block %i (keyframe)\n",
733 current += 16 * linesize;
737 uint8_t *previous =
s->prev->data[
i];
739 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
744 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
746 for (y = 0; y <
height; y += 16) {
747 for (x = 0; x <
width; x += 16) {
754 "Error in svq1_decode_delta_block %i\n",
763 current += 16 * linesize;
793 for (
int i = 0;
i < 6;
i++) {
822 s->width = avctx->
width + 3 & ~3;
823 s->height = avctx->
height + 3 & ~3;
830 s->last_tempref = 0xFF;
841 s->pkt_swapped_allocated = 0;
843 s->pmv_allocated = 0;
857 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),