86 #define FULLPEL_MODE 1
87 #define HALFPEL_MODE 2
88 #define THIRDPEL_MODE 3
89 #define PREDICT_MODE 4
101 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
102 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
103 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
104 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
108 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
109 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
110 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
111 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
117 { 0, 2 }, { 1, 1 }, { 2, 0 },
118 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
119 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
120 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
121 { 2, 4 }, { 3, 3 }, { 4, 2 },
127 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
128 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
129 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
130 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
131 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
132 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
133 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
134 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
135 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
136 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
137 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
138 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
141 static const struct {
145 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
146 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
147 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
148 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
152 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
153 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
154 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
155 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
166 for (i = 0; i < 4; i++) {
167 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
168 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
169 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
170 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
172 temp[4 * i + 0] = z0 + z3;
173 temp[4 * i + 1] = z1 + z2;
174 temp[4 * i + 2] = z1 - z2;
175 temp[4 * i + 3] = z0 - z3;
178 for (i = 0; i < 4; i++) {
179 const int offset = x_offset[i];
180 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
181 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
182 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
183 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
185 output[
stride * 0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20;
186 output[
stride * 2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20;
187 output[
stride * 8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20;
188 output[
stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20;
194 int stride,
int qp,
int dc)
200 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
201 : qmul * (block[0] >> 3) / 2);
205 for (i = 0; i < 4; i++) {
206 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
207 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
208 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
209 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
211 block[0 + 4 * i] = z0 + z3;
212 block[1 + 4 * i] = z1 + z2;
213 block[2 + 4 * i] = z1 - z2;
214 block[3 + 4 * i] = z0 - z3;
217 for (i = 0; i < 4; i++) {
218 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
219 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
220 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
221 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
222 const int rr = (dc + 0x80000);
224 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
225 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
226 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
227 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
230 memset(block, 0, 16 *
sizeof(int16_t));
234 int index,
const int type)
236 static const uint8_t *
const scan_patterns[4] =
241 const int intra = 3 * type >> 2;
242 const uint8_t *
const scan = scan_patterns[type];
244 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
246 int sign = (vlc & 1) ? 0 : -1;
253 }
else if (vlc < 4) {
258 level = (vlc + 9 >> 2) - run;
267 ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
271 ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
275 if ((index += run) >= limit)
278 block[scan[
index]] = (level ^ sign) - sign;
291 int mx,
int my,
int dxy,
292 int thirdpel,
int dir,
int avg)
298 int blocksize = 2 - (width >> 3);
303 if (mx < 0 || mx >= s->
h_edge_pos - width - 1 ||
306 mx = av_clip(mx, -16, s->
h_edge_pos - width + 15);
307 my = av_clip(my, -16, s->
v_edge_pos - height + 15);
317 width + 1, height + 1,
331 mx = mx + (mx < (int) x) >> 1;
332 my = my + (my < (int) y) >> 1;
334 height = height >> 1;
337 for (i = 1; i < 3; i++) {
344 width + 1, height + 1,
366 int i, j, k, mx, my, dx, dy, x, y;
368 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
369 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
370 const int extra_width = (mode ==
PREDICT_MODE) ? -16 * 6 : 0;
371 const int h_edge_pos = 6 * (s->
h_edge_pos - part_width) - extra_width;
372 const int v_edge_pos = 6 * (s->
v_edge_pos - part_height) - extra_width;
374 for (i = 0; i < 16; i += part_height)
375 for (j = 0; j < 16; j += part_width) {
376 const int b_xy = (4 * h->
mb_x + (j >> 2)) +
379 x = 16 * h->
mb_x + j;
380 y = 16 * h->
mb_y + i;
381 k = (j >> 2 & 1) + (i >> 1 & 2) +
382 (j >> 1 & 4) + (i & 8);
385 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
404 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
405 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
423 mx = (mx + 1 >> 1) + dx;
424 my = (my + 1 >> 1) + dy;
425 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
426 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
427 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
430 fx, fy, dxy, 1, dir, avg);
434 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
435 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
436 dxy = (mx & 1) + 2 * (my & 1);
439 mx >> 1, my >> 1, dxy, 0, dir, avg);
443 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
444 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
447 mx, my, 0, 0, dir, avg);
456 if (part_height == 8 && i < 8) {
459 if (part_width == 8 && j < 8)
462 if (part_width == 8 && j < 8)
464 if (part_width == 4 || part_height == 4)
470 part_width >> 2, part_height >> 2, h->
b_stride,
480 int i, j, k, m, dir, mode;
484 const int mb_xy = h->
mb_xy;
511 }
else if (mb_type < 8) {
529 for (m = 0; m < 2; m++) {
531 for (i = 0; i < 4; i++)
535 for (i = 0; i < 4; i++)
541 4 * 2 *
sizeof(int16_t));
577 for (i = 0; i < 4; i++)
579 0, 4 * 2 *
sizeof(int16_t));
585 for (i = 0; i < 4; i++)
587 0, 4 * 2 *
sizeof(int16_t));
592 }
else if (mb_type == 8 || mb_type == 33) {
597 for (i = 0; i < 4; i++)
613 for (i = 0; i < 16; i += 2) {
625 left[2] =
svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
627 if (left[1] == -1 || left[2] == -1) {
633 for (i = 0; i < 4; i++)
645 for (i = 0; i < 4; i++)
655 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
667 for (i = 0; i < 4; i++)
669 0, 4 * 2 *
sizeof(int16_t));
671 for (i = 0; i < 4; i++)
673 0, 4 * 2 *
sizeof(int16_t));
707 "error while decoding intra luma dc\n");
716 for (i = 0; i < 4; i++)
717 if ((cbp & (1 << i))) {
718 for (j = 0; j < 4; j++) {
719 k = index ? (1 * (j & 1) + 2 * (i & 1) +
720 2 * (j & 2) + 4 * (i & 2))
726 "error while decoding block\n");
733 for (i = 1; i < 3; ++i)
736 "error while decoding chroma dc block\n");
741 for (i = 1; i < 3; i++) {
742 for (j = 0; j < 4; j++) {
748 "error while decoding chroma ac block\n");
770 const int mb_xy = h->
mb_xy;
776 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
781 int length = header >> 5 & 3;
814 if ((header & 0x9F) == 2) {
842 -1, 4 *
sizeof(int8_t));
844 -1, 8 *
sizeof(int8_t) * h->
mb_x);
862 unsigned char *extradata;
863 unsigned char *extradata_end;
865 int marker_found = 0;
894 extradata = (
unsigned char *)avctx->
extradata;
898 if (!memcmp(extradata,
"SEQH", 4)) {
912 if (size > extradata_end - extradata - 8)
918 switch (frame_size_code) {
980 unsigned long buf_len = watermark_width *
981 watermark_height * 4;
985 if (watermark_height > 0 &&
986 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
991 watermark_width, watermark_height);
993 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
994 u1, u2, u3, u4, offset);
995 if (uncompress(buf, &buf_len, extradata + 8 + offset,
996 size - offset) != Z_OK) {
998 "could not uncompress watermark logo\n");
1009 "this svq3 file contains watermark which need zlib support compiled in\n");
1036 for (i = 0; i < 2; i++) {
1051 const int b4_stride = h->
mb_width * 4 + 1;
1052 const int b4_array_size = b4_stride * h->
mb_height * 4;
1063 for (i = 0; i < 2; i++) {
1103 int buf_size = avpkt->
size;
1107 if (buf_size == 0) {
1147 for (i = 0; i < 16; i++) {
1151 for (i = 0; i < 16; i++) {
1186 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1222 for (m = 0; m < 2; m++) {
1224 for (i = 0; i < 4; i++) {
1226 for (j = -1; j < 4; j++)
1258 "error while decoding MB %d %d\n", h->
mb_x, h->
mb_y);