46 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
78 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
79 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
80 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
81 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
82 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
83 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
84 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
85 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
86 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
87 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
88 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
89 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
90 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
91 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
92 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
93 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
94 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
95 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
96 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
97 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
98 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
99 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
100 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
101 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
102 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
103 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
104 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
105 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
106 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
107 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
108 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
109 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
112 #define SVQ1_PROCESS_VECTOR() \
113 for (; level > 0; i++) { \
121 if (!get_bits1(bitbuf)) \
124 list[n++] = list[i]; \
125 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
128 #define SVQ1_ADD_CODEBOOK() \
130 for (j = 0; j < stages; j++) { \
131 n3 = codebook[entries[j]] ^ 0x80808080; \
132 n1 += (n3 & 0xFF00FF00) >> 8; \
133 n2 += n3 & 0x00FF00FF; \
137 if (n1 & 0xFF00FF00) { \
138 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
140 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
141 n1 &= n3 & 0x00FF00FF; \
144 if (n2 & 0xFF00FF00) { \
145 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
147 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
148 n2 &= n3 & 0x00FF00FF; \
151 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
152 codebook = (const uint32_t *)cbook[level]; \
154 bit_cache = get_bits(bitbuf, 4 * stages); \
156 for (j = 0; j < stages; j++) { \
157 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
158 16 * j) << (level + 1); \
160 mean -= stages * 128; \
161 n4 = (mean << 16) + mean;
175 uint32_t n1, n2, n3, n4;
181 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
185 dst = (uint32_t *)
list[
i];
193 for (y = 0; y <
height; y++)
194 memset(&dst[y * (pitch / 4)], 0,
width);
198 if ((stages > 0 &&
level >= 4)) {
200 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
209 for (y = 0; y <
height; y++)
210 memset(&dst[y * (pitch / 4)],
mean,
width);
214 for (y = 0; y <
height; y++) {
220 dst[x] = n1 << 8 | n2;
242 uint32_t n1, n2, n3, n4;
248 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
252 dst = (uint32_t *)
list[
i];
262 if ((stages > 0 &&
level >= 4)) {
264 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
274 for (y = 0; y <
height; y++) {
278 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
279 n2 = n4 + (n3 & 0x00FF00FF);
282 dst[x] = n1 << 8 | n2;
296 for (
i = 0;
i < 2;
i++) {
317 ptrdiff_t pitch,
int x,
int y)
323 src = &previous[x + y * pitch];
326 for (
i = 0;
i < 16;
i++) {
327 memcpy(dst,
src, 16);
334 uint8_t *current, uint8_t *previous,
335 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
350 pmv[1] = &motion[x / 8 + 2];
351 pmv[2] = &motion[x / 8 + 4];
359 motion[x / 8 + 2].x =
360 motion[x / 8 + 3].x =
mv.x;
362 motion[x / 8 + 2].y =
363 motion[x / 8 + 3].y =
mv.y;
368 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
377 uint8_t *current, uint8_t *previous,
378 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
393 pmv[1] = &motion[(x / 8) + 2];
394 pmv[2] = &motion[(x / 8) + 4];
407 pmv[1] = &motion[(x / 8) + 3];
415 pmv[2] = &motion[(x / 8) + 1];
422 pmv[2] = &motion[(x / 8) + 2];
423 pmv[3] = &motion[(x / 8) + 3];
430 for (
i = 0;
i < 4;
i++) {
431 int mvx = pmv[
i]->x + (
i & 1) * 16;
432 int mvy = pmv[
i]->y + (
i >> 1) * 16;
438 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
445 current += 8 * (pitch - 1);
455 uint8_t *current, uint8_t *previous,
456 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
470 motion[x / 8 + 2].x =
471 motion[x / 8 + 2].y =
472 motion[x / 8 + 3].x =
473 motion[x / 8 + 3].y = 0;
476 switch (block_type) {
486 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
497 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
519 for (
i = 1;
i <=
out[0];
i++) {
554 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
559 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
560 (csum == 0) ?
"correct" :
"incorrect", csum);
563 if ((
s->frame_code ^ 0x10) >= 0x50) {
569 "embedded message:\n%s\n", ((
char *)msg) + 1);
577 frame_size_code =
get_bits(bitbuf, 3);
579 if (frame_size_code == 7) {
622 const uint8_t *buf = avpkt->
data;
623 int buf_size = avpkt->
size;
638 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
642 if (
s->frame_code != 0x20) {
645 if (buf_size < 9 * 4) {
651 &
s->pkt_swapped_allocated,
656 memcpy(
s->pkt_swapped, buf, buf_size);
657 buf =
s->pkt_swapped;
661 src = (uint32_t *)(
s->pkt_swapped + 4);
663 for (
i = 0;
i < 4;
i++)
669 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
692 for (
i = 0;
i < 3;
i++) {
704 current = cur->
data[
i];
708 for (y = 0; y <
height; y += 16) {
709 for (x = 0; x <
width; x += 16) {
714 "Error in svq1_decode_block %i (keyframe)\n",
719 current += 16 * linesize;
723 uint8_t *previous =
s->prev->data[
i];
725 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
730 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
732 for (y = 0; y <
height; y += 16) {
733 for (x = 0; x <
width; x += 16) {
740 "Error in svq1_decode_delta_block %i\n",
749 current += 16 * linesize;
777 for (
int i = 0,
offset = 0;
i < 6;
i++) {
778 static const uint8_t
sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
779 { 10, 10, 14, 14, 14, 16 } };
815 s->width = avctx->
width + 3 & ~3;
816 s->height = avctx->
height + 3 & ~3;
832 s->pkt_swapped_allocated = 0;
834 s->pmv_allocated = 0;