47 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
79 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
80 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
81 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
82 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
83 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
84 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
85 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
86 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
87 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
88 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
89 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
90 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
91 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
92 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
93 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
94 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
95 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
96 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
97 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
98 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
99 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
100 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
101 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
102 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
103 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
104 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
105 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
106 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
107 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
108 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
109 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
110 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
113 #define SVQ1_PROCESS_VECTOR() \
114 for (; level > 0; i++) { \
122 if (!get_bits1(bitbuf)) \
125 list[n++] = list[i]; \
126 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
129 #define SVQ1_ADD_CODEBOOK() \
131 for (j = 0; j < stages; j++) { \
132 n3 = codebook[entries[j]] ^ 0x80808080; \
133 n1 += (n3 & 0xFF00FF00) >> 8; \
134 n2 += n3 & 0x00FF00FF; \
138 if (n1 & 0xFF00FF00) { \
139 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
141 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
142 n1 &= n3 & 0x00FF00FF; \
145 if (n2 & 0xFF00FF00) { \
146 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
148 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
149 n2 &= n3 & 0x00FF00FF; \
152 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
153 codebook = (const uint32_t *)cbook[level]; \
155 bit_cache = get_bits(bitbuf, 4 * stages); \
157 for (j = 0; j < stages; j++) { \
158 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
159 16 * j) << (level + 1); \
161 mean -= stages * 128; \
162 n4 = (mean << 16) + mean;
176 uint32_t n1, n2, n3, n4;
182 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
186 dst = (uint32_t *)
list[
i];
194 for (y = 0; y <
height; y++)
195 memset(&dst[y * (pitch / 4)], 0,
width);
199 if ((stages > 0 &&
level >= 4)) {
201 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
210 for (y = 0; y <
height; y++)
211 memset(&dst[y * (pitch / 4)],
mean,
width);
215 for (y = 0; y <
height; y++) {
221 dst[x] = n1 << 8 | n2;
243 uint32_t n1, n2, n3, n4;
249 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
253 dst = (uint32_t *)
list[
i];
263 if ((stages > 0 &&
level >= 4)) {
265 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
275 for (y = 0; y <
height; y++) {
279 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
280 n2 = n4 + (n3 & 0x00FF00FF);
283 dst[x] = n1 << 8 | n2;
297 for (
i = 0;
i < 2;
i++) {
318 ptrdiff_t pitch,
int x,
int y)
324 src = &previous[x + y * pitch];
327 for (
i = 0;
i < 16;
i++) {
328 memcpy(dst,
src, 16);
335 uint8_t *current, uint8_t *previous,
336 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
351 pmv[1] = &motion[x / 8 + 2];
352 pmv[2] = &motion[x / 8 + 4];
360 motion[x / 8 + 2].x =
361 motion[x / 8 + 3].x =
mv.x;
363 motion[x / 8 + 2].y =
364 motion[x / 8 + 3].y =
mv.y;
369 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
378 uint8_t *current, uint8_t *previous,
379 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
394 pmv[1] = &motion[(x / 8) + 2];
395 pmv[2] = &motion[(x / 8) + 4];
408 pmv[1] = &motion[(x / 8) + 3];
416 pmv[2] = &motion[(x / 8) + 1];
423 pmv[2] = &motion[(x / 8) + 2];
424 pmv[3] = &motion[(x / 8) + 3];
431 for (
i = 0;
i < 4;
i++) {
432 int mvx = pmv[
i]->x + (
i & 1) * 16;
433 int mvy = pmv[
i]->y + (
i >> 1) * 16;
439 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
446 current += 8 * (pitch - 1);
456 uint8_t *current, uint8_t *previous,
457 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
471 motion[x / 8 + 2].x =
472 motion[x / 8 + 2].y =
473 motion[x / 8 + 3].x =
474 motion[x / 8 + 3].y = 0;
477 switch (block_type) {
487 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
498 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
520 for (
i = 1;
i <=
out[0];
i++) {
555 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
560 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
561 (csum == 0) ?
"correct" :
"incorrect", csum);
564 if ((
s->frame_code ^ 0x10) >= 0x50) {
570 "embedded message:\n%s\n", ((
char *)msg) + 1);
578 frame_size_code =
get_bits(bitbuf, 3);
580 if (frame_size_code == 7) {
623 const uint8_t *buf = avpkt->
data;
624 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;