46 extern const uint8_t
ff_mvtab[33][2];
62 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
63 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
64 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
65 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
66 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
67 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
68 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
69 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
70 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
71 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
72 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
73 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
74 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
75 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
76 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
77 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
78 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
79 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
80 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
81 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
82 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
83 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
84 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
85 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
86 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
87 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
88 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
89 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
90 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
91 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
92 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
93 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
97 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
98 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
99 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
100 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
101 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
102 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
103 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
104 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
105 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
106 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
107 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
108 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
109 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
110 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
111 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
112 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
113 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
114 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
115 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
116 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
117 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
118 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
119 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
120 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
121 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
122 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
123 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
124 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
125 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
126 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
127 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
128 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
131 #define SVQ1_PROCESS_VECTOR()\
132 for (; level > 0; i++) {\
140 if (get_bits1 (bitbuf) == 0)\
143 list[n++] = list[i];\
144 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
147 #define SVQ1_ADD_CODEBOOK()\
149 for (j=0; j < stages; j++) {\
150 n3 = codebook[entries[j]] ^ 0x80808080;\
151 n1 += ((n3 & 0xFF00FF00) >> 8);\
152 n2 += (n3 & 0x00FF00FF);\
156 if (n1 & 0xFF00FF00) {\
157 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
159 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
160 n1 &= (n3 & 0x00FF00FF);\
163 if (n2 & 0xFF00FF00) {\
164 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
166 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
167 n2 &= (n3 & 0x00FF00FF);\
170 #define SVQ1_DO_CODEBOOK_INTRA()\
171 for (y=0; y < height; y++) {\
172 for (x=0; x < (width / 4); x++, codebook++) {\
177 dst[x] = (n1 << 8) | n2;\
182 #define SVQ1_DO_CODEBOOK_NONINTRA()\
183 for (y=0; y < height; y++) {\
184 for (x=0; x < (width / 4); x++, codebook++) {\
187 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
188 n2 = (n3 & 0x00FF00FF) + n4;\
191 dst[x] = (n1 << 8) | n2;\
196 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
197 codebook = (const uint32_t *) cbook[level];\
199 bit_cache = get_bits (bitbuf, 4*stages);\
201 for (j=0; j < stages; j++) {\
202 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
204 mean -= (stages * 128);\
205 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
211 const uint32_t *codebook;
216 uint32_t n1, n2, n3, n4;
222 for (i=0, m=1, n=1, level=5; i < n; i++) {
226 dst = (uint32_t *) list[i];
227 width = 1 << ((4 +
level) /2);
228 height = 1 << ((3 +
level) /2);
231 stages =
get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
234 for (y=0; y <
height; y++) {
235 memset (&dst[y*(pitch / 4)], 0, width);
240 if ((stages > 0) && (level >= 4)) {
242 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
250 for (y=0; y <
height; y++) {
251 memset (&dst[y*(pitch / 4)], mean, width);
266 const uint32_t *codebook;
271 uint32_t n1, n2, n3, n4;
277 for (i=0, m=1, n=1, level=5; i < n; i++) {
281 dst = (uint32_t *) list[i];
282 width = 1 << ((4 +
level) /2);
283 height = 1 << ((3 +
level) /2);
286 stages =
get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
288 if (stages == -1)
continue;
290 if ((stages > 0) && (level >= 4)) {
292 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
309 for (i=0; i < 2; i++) {
329 static void svq1_skip_block (uint8_t *current, uint8_t *previous,
int pitch,
int x,
int y) {
334 src = &previous[x + y*pitch];
337 for (i=0; i < 16; i++) {
338 memcpy (dst, src, 16);
345 uint8_t *current, uint8_t *previous,
int pitch,
360 pmv[1] = &motion[(x / 8) + 2];
361 pmv[2] = &motion[(x / 8) + 4];
370 motion[(x / 8) + 2].x =
371 motion[(x / 8) + 3].
x = mv.
x;
373 motion[(x / 8) + 2].y =
374 motion[(x / 8) + 3].
y = mv.
y;
376 if(y + (mv.
y >> 1)<0)
378 if(x + (mv.
x >> 1)<0)
381 src = &previous[(x + (mv.
x >> 1)) + (y + (mv.
y >> 1))*pitch];
390 uint8_t *current, uint8_t *previous,
int pitch,
405 pmv[1] = &motion[(x / 8) + 2];
406 pmv[2] = &motion[(x / 8) + 4];
421 pmv[1] = &motion[(x / 8) + 3];
430 pmv[2] = &motion[(x / 8) + 1];
438 pmv[2] = &motion[(x / 8) + 2];
439 pmv[3] = &motion[(x / 8) + 3];
447 for (i=0; i < 4; i++) {
448 int mvx= pmv[i]->x + (i&1)*16;
449 int mvy= pmv[i]->y + (i>>1)*16;
457 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
464 current += 8*(pitch - 1);
474 uint8_t *current, uint8_t *previous,
int pitch,
486 motion[(x / 8) + 2].x =
487 motion[(x / 8) + 2].
y =
488 motion[(x / 8) + 3].x =
489 motion[(x / 8) + 3].
y = 0;
492 switch (block_type) {
502 av_dlog(s->
avctx,
"Error in svq1_motion_inter_block %i\n", result);
513 av_dlog(s->
avctx,
"Error in svq1_motion_inter_4v_block %i\n", result);
530 for (i=0; i < length; i++) {
531 value =
checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
545 for (i=1; i <= out[0]; i++) {
573 if ((s->
f_code ^ 0x10) >= 0x50) {
586 frame_size_code =
get_bits (bitbuf, 3);
588 if (frame_size_code == 7) {
626 void *
data,
int *data_size,
629 const uint8_t *buf = avpkt->
data;
630 int buf_size = avpkt->
size;
632 uint8_t *current, *previous;
650 if (buf_size < 9 * 4) {
667 for (i = 0; i < 4; i++)
668 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
675 av_dlog(s->
avctx,
"Error in svq1_decode_frame_header %i\n",result);
697 for (i=0; i < 3; i++) {
720 for (y=0; y <
height; y+=16) {
721 for (x=0; x <
width; x+=16) {
729 current += 16*linesize;
733 memset (pmv, 0, ((width / 8) + 3) *
sizeof(
svq1_pmv));
735 for (y=0; y <
height; y+=16) {
736 for (x=0; x <
width; x+=16) {
738 linesize, pmv, x, y);
741 av_dlog(s->
avctx,
"Error in svq1_decode_delta_block %i\n",result);
749 current += 16*linesize;
791 for (i = 0; i < 6; i++) {
792 static const uint8_t
sizes[2][6] = {{14, 10, 14, 18, 16, 18}, {10, 10, 14, 14, 14, 16}};
794 svq1_intra_multistage[i].
table = &table[offset];
796 offset += sizes[0][i];
797 init_vlc(&svq1_intra_multistage[i], 3, 8,
800 svq1_inter_multistage[i].
table = &table[offset];
802 offset += sizes[1][i];
803 init_vlc(&svq1_inter_multistage[i], 3, 8,