89 #define FULLPEL_MODE 1
90 #define HALFPEL_MODE 2
91 #define THIRDPEL_MODE 3
92 #define PREDICT_MODE 4
104 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
105 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
106 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
107 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
111 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
112 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
113 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
114 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
120 { 0, 2 }, { 1, 1 }, { 2, 0 },
121 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
122 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
123 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
124 { 2, 4 }, { 3, 3 }, { 4, 2 },
130 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
131 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
132 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
133 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
134 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
135 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
136 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
137 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
138 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
139 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
140 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
141 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
144 static const struct {
148 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
149 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
150 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
151 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
155 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
156 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
157 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
158 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
171 for (i = 0; i < 4; i++) {
172 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
173 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
174 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
175 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
177 temp[4 * i + 0] = z0 + z3;
178 temp[4 * i + 1] = z1 + z2;
179 temp[4 * i + 2] = z1 - z2;
180 temp[4 * i + 3] = z0 - z3;
183 for (i = 0; i < 4; i++) {
184 const int offset = x_offset[i];
185 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
186 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
187 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
188 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
190 output[
stride * 0 +
offset] = (z0 + z3) * qmul + 0x80000 >> 20;
191 output[
stride * 2 +
offset] = (z1 + z2) * qmul + 0x80000 >> 20;
192 output[
stride * 8 +
offset] = (z1 - z2) * qmul + 0x80000 >> 20;
193 output[
stride * 10 +
offset] = (z0 - z3) * qmul + 0x80000 >> 20;
205 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
206 : qmul * (block[0] >> 3) / 2);
210 for (i = 0; i < 4; i++) {
211 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
212 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
213 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
214 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
216 block[0 + 4 * i] = z0 + z3;
217 block[1 + 4 * i] = z1 + z2;
218 block[2 + 4 * i] = z1 - z2;
219 block[3 + 4 * i] = z0 - z3;
222 for (i = 0; i < 4; i++) {
223 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
224 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
225 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
226 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
227 const int rr = (dc + 0x80000);
229 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
230 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
231 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
232 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
235 memset(block, 0, 16 *
sizeof(int16_t));
241 static const uint8_t *
const scan_patterns[4] =
246 const int intra = 3 * type >> 2;
249 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
254 sign = (vlc & 1) ? 0 : -1;
261 }
else if (vlc < 4) {
266 level = (vlc + 9 >> 2) - run;
274 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
277 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
282 if ((index += run) >= limit)
285 block[scan[
index]] = (level ^ sign) - sign;
298 int mx,
int my,
int dxy,
299 int thirdpel,
int dir,
int avg)
305 int blocksize = 2 - (width >> 3);
310 if (mx < 0 || mx >= s->
h_edge_pos - width - 1 ||
313 mx = av_clip(mx, -16, s->
h_edge_pos - width + 15);
314 my = av_clip(my, -16, s->
v_edge_pos - height + 15);
324 width + 1, height + 1,
338 mx = mx + (mx < (int) x) >> 1;
339 my = my + (my < (int) y) >> 1;
341 height = height >> 1;
344 for (i = 1; i < 3; i++) {
351 width + 1, height + 1,
373 int i, j, k, mx, my, dx, dy, x,
y;
375 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
376 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
377 const int extra_width = (mode ==
PREDICT_MODE) ? -16 * 6 : 0;
378 const int h_edge_pos = 6 * (s->
h_edge_pos - part_width) - extra_width;
379 const int v_edge_pos = 6 * (s->
v_edge_pos - part_height) - extra_width;
381 for (i = 0; i < 16; i += part_height)
382 for (j = 0; j < 16; j += part_width) {
383 const int b_xy = (4 * h->
mb_x + (j >> 2)) +
386 x = 16 * h->
mb_x + j;
387 y = 16 * h->
mb_y + i;
388 k = (j >> 2 & 1) + (i >> 1 & 2) +
389 (j >> 1 & 4) + (i & 8);
392 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
411 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
412 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
430 mx = (mx + 1 >> 1) + dx;
431 my = (my + 1 >> 1) + dy;
432 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
433 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
434 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
437 fx, fy, dxy, 1, dir, avg);
441 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
442 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
443 dxy = (mx & 1) + 2 * (my & 1);
446 mx >> 1, my >> 1, dxy, 0, dir, avg);
450 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
451 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
454 mx, my, 0, 0, dir, avg);
463 if (part_height == 8 && i < 8) {
466 if (part_width == 8 && j < 8)
469 if (part_width == 8 && j < 8)
471 if (part_width == 4 || part_height == 4)
477 part_width >> 2, part_height >> 2, h->
b_stride,
487 int i, j, k,
m, dir,
mode;
491 const int mb_xy = h->
mb_xy;
518 }
else if (mb_type < 8) {
536 for (m = 0; m < 2; m++) {
538 for (i = 0; i < 4; i++)
542 for (i = 0; i < 4; i++)
548 4 * 2 *
sizeof(int16_t));
584 for (i = 0; i < 4; i++)
586 0, 4 * 2 *
sizeof(int16_t));
592 for (i = 0; i < 4; i++)
594 0, 4 * 2 *
sizeof(int16_t));
599 }
else if (mb_type == 8 || mb_type == 33) {
604 for (i = 0; i < 4; i++)
620 for (i = 0; i < 16; i += 2) {
632 left[2] =
svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
634 if (left[1] == -1 || left[2] == -1) {
640 for (i = 0; i < 4; i++)
652 for (i = 0; i < 4; i++)
662 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
674 for (i = 0; i < 4; i++)
676 0, 4 * 2 *
sizeof(int16_t));
678 for (i = 0; i < 4; i++)
680 0, 4 * 2 *
sizeof(int16_t));
714 "error while decoding intra luma dc\n");
723 for (i = 0; i < 4; i++)
724 if ((cbp & (1 << i))) {
725 for (j = 0; j < 4; j++) {
726 k = index ? (1 * (j & 1) + 2 * (i & 1) +
727 2 * (j & 2) + 4 * (i & 2))
733 "error while decoding block\n");
740 for (i = 1; i < 3; ++i)
743 "error while decoding chroma dc block\n");
748 for (i = 1; i < 3; i++) {
749 for (j = 0; j < 4; j++) {
755 "error while decoding chroma ac block\n");
777 const int mb_xy = h->
mb_xy;
783 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
788 int length = header >> 5 & 3;
821 if ((header & 0x9F) == 2) {
849 -1, 4 *
sizeof(int8_t));
851 -1, 8 *
sizeof(int8_t) * h->
mb_x);
869 unsigned char *extradata;
870 unsigned char *extradata_end;
872 int marker_found = 0;
901 extradata = (
unsigned char *)avctx->
extradata;
905 if (!memcmp(extradata,
"SEQH", 4)) {
919 if (size > extradata_end - extradata - 8) {
927 switch (frame_size_code) {
991 unsigned long buf_len = watermark_width *
992 watermark_height * 4;
996 if (watermark_height <= 0 ||
997 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height) {
1004 watermark_width, watermark_height);
1006 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1007 u1, u2, u3, u4, offset);
1008 if (uncompress(buf, &buf_len, extradata + 8 + offset,
1009 size - offset) != Z_OK) {
1011 "could not uncompress watermark logo\n");
1023 "this svq3 file contains watermark which need zlib support compiled in\n");
1054 for (i = 0; i < 2; i++) {
1069 const int b4_stride = h->
mb_width * 4 + 1;
1070 const int b4_array_size = b4_stride * h->
mb_height * 4;
1081 for (i = 0; i < 2; i++) {
1120 int buf_size = avpkt->
size;
1126 if (buf_size == 0) {
1143 memcpy(s->
buf, avpkt->
data, buf_size);
1176 for (i = 0; i < 16; i++) {
1180 for (i = 0; i < 16; i++) {
1217 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1253 for (m = 0; m < 2; m++) {
1255 for (i = 0; i < 4; i++) {
1257 for (j = -1; j < 4; j++)
1289 "error while decoding MB %d %d\n", h->
mb_x, h->
mb_y);
1293 if (mb_type != 0 || h->
cbp)