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++) {
288 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
289 n2 = n4 + (n3 & 0x00FF00FF);
292 dst[x] = n1 << 8 | n2;
306 for (
i = 0;
i < 2;
i++) {
327 ptrdiff_t pitch,
int x,
int y)
333 src = &previous[x + y * pitch];
336 for (
i = 0;
i < 16;
i++) {
337 memcpy(dst,
src, 16);
344 uint8_t *current, uint8_t *previous,
345 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
360 pmv[1] = &motion[x / 8 + 2];
361 pmv[2] = &motion[x / 8 + 4];
369 motion[x / 8 + 2].x =
370 motion[x / 8 + 3].x =
mv.x;
372 motion[x / 8 + 2].y =
373 motion[x / 8 + 3].y =
mv.y;
378 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
387 uint8_t *current, uint8_t *previous,
388 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
403 pmv[1] = &motion[(x / 8) + 2];
404 pmv[2] = &motion[(x / 8) + 4];
417 pmv[1] = &motion[(x / 8) + 3];
425 pmv[2] = &motion[(x / 8) + 1];
432 pmv[2] = &motion[(x / 8) + 2];
433 pmv[3] = &motion[(x / 8) + 3];
440 for (
i = 0;
i < 4;
i++) {
441 int mvx = pmv[
i]->x + (
i & 1) * 16;
442 int mvy = pmv[
i]->y + (
i >> 1) * 16;
448 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
455 current += 8 * (pitch - 1);
465 uint8_t *current, uint8_t *previous,
466 ptrdiff_t pitch, svq1_pmv *motion,
int x,
int y,
480 motion[x / 8 + 2].x =
481 motion[x / 8 + 2].y =
482 motion[x / 8 + 3].x =
483 motion[x / 8 + 3].y = 0;
486 switch (block_type) {
496 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n",
result);
507 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n",
result);
529 for (
i = 1;
i <=
out[0];
i++) {
546 *buggy = tempref == 0 &&
s->last_tempref == 0 && avctx->
extradata_size == 0;
547 s->last_tempref = tempref;
567 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
572 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
573 (csum == 0) ?
"correct" :
"incorrect", csum);
576 if ((
s->frame_code ^ 0x10) >= 0x50) {
582 "embedded message:\n%s\n", ((
char *)msg) + 1);
590 frame_size_code =
get_bits(bitbuf, 3);
592 if (frame_size_code == 7) {
635 const uint8_t *buf = avpkt->
data;
636 int buf_size = avpkt->
size;
650 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
654 if (
s->frame_code != 0x20) {
657 if (buf_size < 9 * 4) {
663 &
s->pkt_swapped_allocated,
668 memcpy(
s->pkt_swapped, buf, buf_size);
669 buf =
s->pkt_swapped;
673 src = (uint32_t *)(
s->pkt_swapped + 4);
675 for (
i = 0;
i < 4;
i++)
681 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n",
result);
704 for (
i = 0;
i < 3;
i++) {
716 current = cur->
data[
i];
720 for (y = 0; y <
height; y += 16) {
721 for (x = 0; x <
width; x += 16) {
726 "Error in svq1_decode_block %i (keyframe)\n",
731 current += 16 * linesize;
735 uint8_t *previous =
s->prev->data[
i];
737 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
742 memset(
s->pmv, 0, ((
width / 8) + 3) *
sizeof(svq1_pmv));
744 for (y = 0; y <
height; y += 16) {
745 for (x = 0; x <
width; x += 16) {
752 "Error in svq1_decode_delta_block %i\n",
761 current += 16 * linesize;
789 for (
int i = 0,
offset = 0;
i < 6;
i++) {
790 static const uint8_t
sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
791 { 10, 10, 14, 14, 14, 16 } };
827 s->width = avctx->
width + 3 & ~3;
828 s->height = avctx->
height + 3 & ~3;
835 s->last_tempref = 0xFF;
846 s->pkt_swapped_allocated = 0;
848 s->pmv_allocated = 0;
862 CODEC_LONG_NAME(
"Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),