93 #define FULLPEL_MODE 1
94 #define HALFPEL_MODE 2
95 #define THIRDPEL_MODE 3
96 #define PREDICT_MODE 4
108 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
109 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
110 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
111 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
115 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
116 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
117 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
118 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
124 { 0, 2 }, { 1, 1 }, { 2, 0 },
125 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
126 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
127 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
128 { 2, 4 }, { 3, 3 }, { 4, 2 },
134 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
135 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
136 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
137 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
138 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
139 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
140 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
141 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
142 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
143 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
144 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
145 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
148 static const struct {
152 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
153 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
154 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
155 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
159 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
160 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
161 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
162 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
175 for (i = 0; i < 4; i++) {
176 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
177 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
178 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
179 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
181 temp[4 * i + 0] = z0 + z3;
182 temp[4 * i + 1] = z1 + z2;
183 temp[4 * i + 2] = z1 - z2;
184 temp[4 * i + 3] = z0 - z3;
187 for (i = 0; i < 4; i++) {
188 const int offset = x_offset[i];
189 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
190 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
191 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
192 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
194 output[
stride * 0 +
offset] = (z0 + z3) * qmul + 0x80000 >> 20;
195 output[
stride * 2 +
offset] = (z1 + z2) * qmul + 0x80000 >> 20;
196 output[
stride * 8 +
offset] = (z1 - z2) * qmul + 0x80000 >> 20;
197 output[
stride * 10 +
offset] = (z0 - z3) * qmul + 0x80000 >> 20;
209 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
210 : qmul * (block[0] >> 3) / 2);
214 for (i = 0; i < 4; i++) {
215 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
216 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
217 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
218 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
220 block[0 + 4 * i] = z0 + z3;
221 block[1 + 4 * i] = z1 + z2;
222 block[2 + 4 * i] = z1 - z2;
223 block[3 + 4 * i] = z0 - z3;
226 for (i = 0; i < 4; i++) {
227 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
228 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
229 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
230 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
231 const int rr = (dc + 0x80000);
233 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
234 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
235 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
236 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
239 memset(block, 0, 16 *
sizeof(int16_t));
245 static const uint8_t *
const scan_patterns[4] =
250 const int intra = 3 * type >> 2;
253 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
258 sign = (vlc & 1) ? 0 : -1;
265 }
else if (vlc < 4) {
270 level = (vlc + 9 >> 2) - run;
278 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
281 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
286 if ((index += run) >= limit)
289 block[scan[
index]] = (level ^ sign) - sign;
302 int mx,
int my,
int dxy,
303 int thirdpel,
int dir,
int avg)
309 int blocksize = 2 - (width >> 3);
314 if (mx < 0 || mx >= s->
h_edge_pos - width - 1 ||
317 mx = av_clip(mx, -16, s->
h_edge_pos - width + 15);
318 my = av_clip(my, -16, s->
v_edge_pos - height + 15);
328 width + 1, height + 1,
342 mx = mx + (mx < (int) x) >> 1;
343 my = my + (my < (int) y) >> 1;
345 height = height >> 1;
348 for (i = 1; i < 3; i++) {
355 width + 1, height + 1,
377 int i, j, k, mx, my, dx, dy, x,
y;
379 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
380 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
381 const int extra_width = (mode ==
PREDICT_MODE) ? -16 * 6 : 0;
382 const int h_edge_pos = 6 * (s->
h_edge_pos - part_width) - extra_width;
383 const int v_edge_pos = 6 * (s->
v_edge_pos - part_height) - extra_width;
385 for (i = 0; i < 16; i += part_height)
386 for (j = 0; j < 16; j += part_width) {
387 const int b_xy = (4 * h->
mb_x + (j >> 2)) +
390 x = 16 * h->
mb_x + j;
391 y = 16 * h->
mb_y + i;
392 k = (j >> 2 & 1) + (i >> 1 & 2) +
393 (j >> 1 & 4) + (i & 8);
396 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
415 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
416 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
434 mx = (mx + 1 >> 1) + dx;
435 my = (my + 1 >> 1) + dy;
436 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
437 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
438 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
441 fx, fy, dxy, 1, dir, avg);
445 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
446 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
447 dxy = (mx & 1) + 2 * (my & 1);
450 mx >> 1, my >> 1, dxy, 0, dir, avg);
454 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
455 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
458 mx, my, 0, 0, dir, avg);
467 if (part_height == 8 && i < 8) {
470 if (part_width == 8 && j < 8)
473 if (part_width == 8 && j < 8)
475 if (part_width == 4 || part_height == 4)
481 part_width >> 2, part_height >> 2, h->
b_stride,
491 int i, j, k,
m, dir,
mode;
495 const int mb_xy = h->
mb_xy;
522 }
else if (mb_type < 8) {
540 for (m = 0; m < 2; m++) {
542 for (i = 0; i < 4; i++)
546 for (i = 0; i < 4; i++)
552 4 * 2 *
sizeof(int16_t));
588 for (i = 0; i < 4; i++)
590 0, 4 * 2 *
sizeof(int16_t));
596 for (i = 0; i < 4; i++)
598 0, 4 * 2 *
sizeof(int16_t));
603 }
else if (mb_type == 8 || mb_type == 33) {
608 for (i = 0; i < 4; i++)
624 for (i = 0; i < 16; i += 2) {
629 "luma prediction:%"PRIu32
"\n", vlc);
637 left[2] =
svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
639 if (left[1] == -1 || left[2] == -1) {
645 for (i = 0; i < 4; i++)
657 for (i = 0; i < 4; i++)
667 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
679 for (i = 0; i < 4; i++)
681 0, 4 * 2 *
sizeof(int16_t));
683 for (i = 0; i < 4; i++)
685 0, 4 * 2 *
sizeof(int16_t));
719 "error while decoding intra luma dc\n");
728 for (i = 0; i < 4; i++)
729 if ((cbp & (1 << i))) {
730 for (j = 0; j < 4; j++) {
731 k = index ? (1 * (j & 1) + 2 * (i & 1) +
732 2 * (j & 2) + 4 * (i & 2))
738 "error while decoding block\n");
745 for (i = 1; i < 3; ++i)
748 "error while decoding chroma dc block\n");
753 for (i = 1; i < 3; i++) {
754 for (j = 0; j < 4; j++) {
760 "error while decoding chroma ac block\n");
782 const int mb_xy = h->
mb_xy;
788 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
793 int length = header >> 5 & 3;
826 if ((header & 0x9F) == 2) {
854 -1, 4 *
sizeof(int8_t));
856 -1, 8 *
sizeof(int8_t) * h->
mb_x);
874 unsigned char *extradata;
875 unsigned char *extradata_end;
877 int marker_found = 0;
909 extradata = (
unsigned char *)avctx->
extradata;
913 if (!memcmp(extradata,
"SEQH", 4)) {
927 if (size > extradata_end - extradata - 8) {
935 switch (frame_size_code) {
999 unsigned long buf_len = watermark_width *
1000 watermark_height * 4;
1004 if (watermark_height <= 0 ||
1005 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height) {
1012 watermark_width, watermark_height);
1014 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1015 u1, u2, u3, u4, offset);
1016 if (uncompress(buf, &buf_len, extradata + 8 + offset,
1017 size - offset) != Z_OK) {
1019 "could not uncompress watermark logo\n");
1031 "this svq3 file contains watermark which need zlib support compiled in\n");
1062 for (i = 0; i < 2; i++) {
1077 const int b4_stride = h->
mb_width * 4 + 1;
1078 const int b4_array_size = b4_stride * h->
mb_height * 4;
1089 for (i = 0; i < 2; i++) {
1128 int buf_size = avpkt->
size;
1134 if (buf_size == 0) {
1151 memcpy(s->
buf, avpkt->
data, buf_size);
1184 for (i = 0; i < 16; i++) {
1188 for (i = 0; i < 16; i++) {
1225 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1261 for (m = 0; m < 2; m++) {
1263 for (i = 0; i < 4; i++) {
1265 for (j = -1; j < 4; j++)
1297 "error while decoding MB %d %d\n", h->
mb_x, h->
mb_y);
1301 if (mb_type != 0 || h->
cbp)