77 #define FULLPEL_MODE 1
78 #define HALFPEL_MODE 2
79 #define THIRDPEL_MODE 3
80 #define PREDICT_MODE 4
92 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
93 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
94 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
95 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
101 { 0, 2 }, { 1, 1 }, { 2, 0 },
102 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
103 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
104 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
105 { 2, 4 }, { 3, 3 }, { 4, 2 },
111 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
112 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
113 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
114 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
115 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
116 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
117 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
118 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
119 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
120 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
121 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
122 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
125 static const struct {
129 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
130 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
131 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
132 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
136 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
137 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
138 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
139 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
150 for (i = 0; i < 4; i++) {
151 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
152 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
153 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
154 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
156 temp[4 * i + 0] = z0 + z3;
157 temp[4 * i + 1] = z1 + z2;
158 temp[4 * i + 2] = z1 - z2;
159 temp[4 * i + 3] = z0 - z3;
162 for (i = 0; i < 4; i++) {
163 const int offset = x_offset[i];
164 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
165 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
166 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
167 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
169 output[
stride * 0 +
offset] = (z0 + z3) * qmul + 0x80000 >> 20;
170 output[
stride * 2 +
offset] = (z1 + z2) * qmul + 0x80000 >> 20;
171 output[
stride * 8 +
offset] = (z1 - z2) * qmul + 0x80000 >> 20;
172 output[
stride * 10 +
offset] = (z0 - z3) * qmul + 0x80000 >> 20;
178 int stride,
int qp,
int dc)
184 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
185 : qmul * (block[0] >> 3) / 2);
189 for (i = 0; i < 4; i++) {
190 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
191 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
192 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
193 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
195 block[0 + 4 * i] = z0 + z3;
196 block[1 + 4 * i] = z1 + z2;
197 block[2 + 4 * i] = z1 - z2;
198 block[3 + 4 * i] = z0 - z3;
201 for (i = 0; i < 4; i++) {
202 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
203 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
204 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
205 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
206 const int rr = (dc + 0x80000);
208 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
209 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
210 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
211 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
216 int index,
const int type)
218 static const uint8_t *
const scan_patterns[4] =
223 const int intra = 3 * type >> 2;
224 const uint8_t *
const scan = scan_patterns[type];
226 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
231 sign = (vlc & 1) ? 0 : -1;
238 }
else if (vlc < 4) {
243 level = (vlc + 9 >> 2) - run;
251 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
254 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
259 if ((index += run) >= limit)
262 block[scan[
index]] = (level ^ sign) - sign;
275 int mx,
int my,
int dxy,
276 int thirdpel,
int dir,
int avg)
281 int blocksize = 2 - (width >> 3);
286 if (mx < 0 || mx >= s->
h_edge_pos - width - 1 ||
291 mx = av_clip(mx, -16, s->
h_edge_pos - width + 15);
292 my = av_clip(my, -16, s->
v_edge_pos - height + 15);
301 width + 1, height + 1,
315 mx = mx + (mx < (int) x) >> 1;
316 my = my + (my < (int) y) >> 1;
318 height = height >> 1;
321 for (i = 1; i < 3; i++) {
327 width + 1, height + 1,
349 int i, j, k, mx, my, dx, dy, x, y;
351 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
352 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
353 const int extra_width = (mode ==
PREDICT_MODE) ? -16 * 6 : 0;
354 const int h_edge_pos = 6 * (s->
h_edge_pos - part_width) - extra_width;
355 const int v_edge_pos = 6 * (s->
v_edge_pos - part_height) - extra_width;
357 for (i = 0; i < 16; i += part_height)
358 for (j = 0; j < 16; j += part_width) {
359 const int b_xy = (4 * s->
mb_x + (j >> 2)) +
362 x = 16 * s->
mb_x + j;
363 y = 16 * s->
mb_y + i;
364 k = (j >> 2 & 1) + (i >> 1 & 2) +
365 (j >> 1 & 4) + (i & 8);
368 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
387 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
388 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
406 mx = (mx + 1 >> 1) + dx;
407 my = (my + 1 >> 1) + dy;
408 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
409 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
410 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
413 fx, fy, dxy, 1, dir, avg);
417 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
418 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
419 dxy = (mx & 1) + 2 * (my & 1);
422 mx >> 1, my >> 1, dxy, 0, dir, avg);
426 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
427 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
430 mx, my, 0, 0, dir, avg);
439 if (part_height == 8 && i < 8) {
442 if (part_width == 8 && j < 8)
445 if (part_width == 8 && j < 8)
447 if (part_width == 4 || part_height == 4)
453 part_width >> 2, part_height >> 2, h->
b_stride,
463 int i, j, k,
m, dir,
mode;
468 const int mb_xy = h->
mb_xy;
495 }
else if (mb_type < 8) {
513 for (m = 0; m < 2; m++) {
515 for (i = 0; i < 4; i++)
519 for (i = 0; i < 4; i++)
525 4 * 2 *
sizeof(int16_t));
561 for (i = 0; i < 4; i++)
563 0, 4 * 2 *
sizeof(int16_t));
569 for (i = 0; i < 4; i++)
571 0, 4 * 2 *
sizeof(int16_t));
576 }
else if (mb_type == 8 || mb_type == 33) {
581 for (i = 0; i < 4; i++)
597 for (i = 0; i < 16; i += 2) {
609 left[2] =
svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
611 if (left[1] == -1 || left[2] == -1) {
617 for (i = 0; i < 4; i++)
629 for (i = 0; i < 4; i++)
639 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
651 for (i = 0; i < 4; i++)
653 0, 4 * 2 *
sizeof(int16_t));
655 for (i = 0; i < 4; i++)
657 0, 4 * 2 *
sizeof(int16_t));
693 "error while decoding intra luma dc\n");
702 for (i = 0; i < 4; i++)
703 if ((cbp & (1 << i))) {
704 for (j = 0; j < 4; j++) {
705 k = index ? (1 * (j & 1) + 2 * (i & 1) +
706 2 * (j & 2) + 4 * (i & 2))
712 "error while decoding block\n");
719 for (i = 1; i < 3; ++i)
722 "error while decoding chroma dc block\n");
727 for (i = 1; i < 3; i++) {
728 for (j = 0; j < 4; j++) {
734 "error while decoding chroma ac block\n");
757 const int mb_xy = h->
mb_xy;
763 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
768 int length = header >> 5 & 3;
801 if ((header & 0x9F) == 2) {
829 -1, 4 *
sizeof(int8_t));
831 -1, 8 *
sizeof(int8_t) * s->
mb_x);
850 unsigned char *extradata;
851 unsigned char *extradata_end;
853 int marker_found = 0;
874 extradata = (
unsigned char *)avctx->
extradata;
878 if (!memcmp(extradata,
"SEQH", 4)) {
892 if (size > extradata_end - extradata - 8)
898 switch (frame_size_code) {
960 unsigned long buf_len = watermark_width *
961 watermark_height * 4;
965 if (watermark_height <= 0 || (uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
970 watermark_width, watermark_height);
972 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
973 u1, u2, u3, u4, offset);
974 if (uncompress(buf, &buf_len, extradata + 8 + offset,
975 size - offset) != Z_OK) {
977 "could not uncompress watermark logo\n");
989 "this svq3 file contains watermark which need zlib support compiled in\n");
1018 int buf_size = avpkt->
size;
1023 if (buf_size == 0) {
1039 memcpy(svq3->
buf, avpkt->
data, buf_size);
1055 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1101 for (m = 0; m < 2; m++) {
1103 for (i = 0; i < 4; i++) {
1105 for (j = -1; j < 4; j++)
1137 "error while decoding MB %d %d\n", s->
mb_x, s->
mb_y);