38 #define BLOCK_TYPE_VLC_BITS 5
39 #define ACDC_VLC_BITS 9
41 #define CFRAME_BUFFER_COUNT 100
46 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
48 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
50 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
52 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
56 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
58 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
60 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
62 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
74 static const int8_t
mv[256][2] = {
75 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
76 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
77 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
78 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
79 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
80 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
81 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
82 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
83 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
84 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
85 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
86 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
87 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
88 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
89 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
90 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
91 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
92 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
93 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
94 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
95 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
96 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
97 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
98 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
99 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
100 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
101 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
102 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
103 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
104 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
105 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
106 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
112 16, 15, 13, 19, 24, 31, 28, 17,
113 17, 23, 25, 31, 36, 63, 45, 21,
114 18, 24, 27, 37, 52, 59, 49, 20,
115 16, 28, 34, 40, 60, 80, 51, 20,
116 18, 31, 48, 66, 68, 86, 56, 21,
117 19, 38, 56, 59, 64, 64, 48, 20,
118 27, 48, 55, 55, 56, 51, 35, 15,
119 20, 35, 34, 32, 31, 22, 15, 8,
152 #define FIX_1_082392200 70936
153 #define FIX_1_414213562 92682
154 #define FIX_1_847759065 121095
155 #define FIX_2_613125930 171254
157 #define MULTIPLY(var, const) (((var) * (const)) >> 16)
161 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
162 int tmp10, tmp11, tmp12, tmp13;
163 int z5, z10, z11, z12, z13;
167 for (i = 0; i < 8; i++) {
168 tmp10 = block[8 * 0 + i] + block[8 * 4 + i];
169 tmp11 = block[8 * 0 + i] - block[8 * 4 + i];
171 tmp13 = block[8 * 2 + i] + block[8 * 6 + i];
174 tmp0 = tmp10 + tmp13;
175 tmp3 = tmp10 - tmp13;
176 tmp1 = tmp11 + tmp12;
177 tmp2 = tmp11 - tmp12;
179 z13 = block[8 * 5 + i] + block[8 * 3 + i];
180 z10 = block[8 * 5 + i] - block[8 * 3 + i];
181 z11 = block[8 * 1 + i] + block[8 * 7 + i];
182 z12 = block[8 * 1 + i] - block[8 * 7 + i];
195 temp[8 * 0 + i] = tmp0 + tmp7;
196 temp[8 * 7 + i] = tmp0 - tmp7;
197 temp[8 * 1 + i] = tmp1 + tmp6;
198 temp[8 * 6 + i] = tmp1 - tmp6;
199 temp[8 * 2 + i] = tmp2 + tmp5;
200 temp[8 * 5 + i] = tmp2 - tmp5;
201 temp[8 * 4 + i] = tmp3 + tmp4;
202 temp[8 * 3 + i] = tmp3 - tmp4;
205 for (i = 0; i < 8 * 8; i += 8) {
206 tmp10 = temp[0 + i] + temp[4 + i];
207 tmp11 = temp[0 + i] - temp[4 + i];
209 tmp13 = temp[2 + i] + temp[6 + i];
212 tmp0 = tmp10 + tmp13;
213 tmp3 = tmp10 - tmp13;
214 tmp1 = tmp11 + tmp12;
215 tmp2 = tmp11 - tmp12;
217 z13 = temp[5 + i] + temp[3 + i];
218 z10 = temp[5 + i] - temp[3 + i];
219 z11 = temp[1 + i] + temp[7 + i];
220 z12 = temp[1 + i] - temp[7 + i];
233 block[0 + i] = (tmp0 + tmp7) >> 6;
234 block[7 + i] = (tmp0 - tmp7) >> 6;
235 block[1 + i] = (tmp1 + tmp6) >> 6;
236 block[6 + i] = (tmp1 - tmp6) >> 6;
237 block[2 + i] = (tmp2 + tmp5) >> 6;
238 block[5 + i] = (tmp2 - tmp5) >> 6;
239 block[4 + i] = (tmp3 + tmp4) >> 6;
240 block[3 + i] = (tmp3 - tmp4) >> 6;
249 for (i = 0; i < 2; i++) {
250 for (j = 0; j < 4; j++) {
251 block_type_vlc[i][j].
table = table[i][j];
265 for (i = 0; i < 256; i++) {
267 f->
mv[i] =
mv[i][0] +
mv[i][1] * linesize / 2;
269 f->
mv[i] = (i & 15) - 8 + ((i >> 4) - 8) * linesize / 2;
274 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
276 unsigned tmpval = AV_RN32(src); \
277 tmpval = (tmpval << 16) | (tmpval >> 16); \
278 tmpval = tmpval * (scale) + (dc); \
279 tmpval = (tmpval << 16) | (tmpval >> 16); \
280 AV_WN32A(dst, tmpval); \
283 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
285 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
286 AV_WN32A(dst, tmpval); \
290 static inline void mcdc(uint16_t *dst,
const uint16_t *
src,
int log2w,
298 for (i = 0; i < h; i++) {
299 dst[0] = scale * src[0] +
dc;
306 for (i = 0; i < h; i++) {
314 for (i = 0; i < h; i++) {
323 for (i = 0; i < h; i++) {
339 int log2w,
int log2h,
int stride)
342 const int h = 1 << log2h;
347 uint16_t *
end = start + stride * (f->
avctx->
height - h + 1) - (1 << log2w);
352 av_assert0(code >= 0 && code <= 6 && log2w >= 0);
356 if ((ret =
decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
359 src + (stride << log2h),
360 log2w, log2h, stride);
361 }
else if (code == 2) {
363 if ((ret =
decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
367 log2w, log2h, stride);
368 }
else if (code == 6) {
374 dst[0] = bytestream2_get_le16u(&f->
g2);
375 dst[1] = bytestream2_get_le16u(&f->
g2);
377 dst[0] = bytestream2_get_le16u(&f->
g2);
378 dst[stride] = bytestream2_get_le16u(&f->
g2);
389 src += f->
mv[bytestream2_get_byte(&f->
g)];
390 }
else if (code == 3 && f->
version >= 2) {
392 }
else if (code == 4) {
393 src += f->
mv[bytestream2_get_byte(&f->
g)];
398 dc = bytestream2_get_le16(&f->
g2);
399 }
else if (code == 5) {
406 dc = bytestream2_get_le16(&f->
g2);
409 if (start > src || src > end) {
414 mcdc(dst, src, log2w, h, stride, scale, dc);
426 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
427 bytestream_offset, wordstream_offset;
436 bitstream_size =
AV_RL32(buf + 8);
437 wordstream_size =
AV_RL32(buf + 12);
438 bytestream_size =
AV_RL32(buf + 16);
441 bitstream_size =
AV_RL16(buf - 4);
442 wordstream_size =
AV_RL16(buf - 2);
443 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
446 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
447 bytestream_size > length - bitstream_size ||
448 wordstream_size > length - bytestream_size - bitstream_size ||
449 extra > length - bytestream_size - bitstream_size - wordstream_size) {
451 bitstream_size+ bytestream_size+ wordstream_size - length);
463 wordstream_offset = extra + bitstream_size;
464 bytestream_offset = extra + bitstream_size + wordstream_size;
466 length - wordstream_offset);
468 length - bytestream_offset);
472 for (y = 0; y <
height; y += 8) {
473 for (x = 0; x <
width; x += 8)
549 for (i = 0; i < 4; i++) {
550 block[i][0] += 0x80 * 8 * 8;
555 for (i = 4; i < 6; i++)
563 for (y = 0; y < 8; y++) {
564 for (x = 0; x < 8; x++) {
565 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
566 2 * (x & 3) + 2 * 8 * (y & 3);
569 int cg = (cb +
cr) >> 1;
575 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
577 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
579 dst[stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
581 dst[1 + stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
584 dst += 2 * stride - 2 * 8;
595 for (i = 0; i < 6; i++)
606 int frequency[512] = { 0 };
613 const uint8_t *ptr_end = buf + buf_size;
616 memset(up, -1,
sizeof(up));
623 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
628 for (i = start; i <=
end; i++)
629 frequency[i] = *ptr++;
638 while ((ptr - buf) & 3)
646 for (j = 257; j < 512; j++) {
647 int min_freq[2] = { 256 * 256, 256 * 256 };
648 int smallest[2] = { 0, 0 };
650 for (i = 0; i < j; i++) {
651 if (frequency[i] == 0)
653 if (frequency[i] < min_freq[1]) {
654 if (frequency[i] < min_freq[0]) {
655 min_freq[1] = min_freq[0];
656 smallest[1] = smallest[0];
657 min_freq[0] = frequency[i];
660 min_freq[1] = frequency[i];
665 if (min_freq[1] == 256 * 256)
668 frequency[j] = min_freq[0] + min_freq[1];
669 flag[smallest[0]] = 0;
670 flag[smallest[1]] = 1;
673 frequency[smallest[0]] = frequency[smallest[1]] = 0;
676 for (j = 0; j < 257; j++) {
679 for (node = j; up[node] != -1; node = up[node]) {
685 "vlc length overflow\n");
701 int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
702 int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
703 int red = 2 * (c0 >> 10) + (c1 >> 10);
704 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
712 const int mbs = (
FFALIGN(width, 16) >> 4) * (
FFALIGN(height, 16) >> 4);
717 if (length < mbs * 8) {
723 for (y = 0; y <
height; y += 16) {
724 for (x = 0; x <
width; x += 16) {
726 if (buf_end - buf < 8)
729 color[0] = bytestream2_get_le16u(&g3);
730 color[1] = bytestream2_get_le16u(&g3);
732 if (color[0] & 0x8000)
734 if (color[1] & 0x8000)
737 color[2] =
mix(color[0], color[1]);
738 color[3] =
mix(color[1], color[0]);
740 bits = bytestream2_get_le32u(&g3);
741 for (y2 = 0; y2 < 16; y2++) {
742 for (x2 = 0; x2 < 16; x2++) {
743 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
744 dst[y2 * width + x2] = color[(
bits >>
index) & 3];
749 dst += 16 * width - x;
760 const unsigned int bitstream_size =
AV_RL32(buf);
761 unsigned int prestream_size;
764 if (bitstream_size > (1 << 26))
767 if (length < bitstream_size + 12) {
772 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
773 prestream = buf + bitstream_size + 12;
775 if (prestream_size + bitstream_size + 12 != length
776 || prestream_size > (1 << 26)) {
778 prestream_size, bitstream_size, length);
792 prestream_size = length + buf - prestream;
804 for (y = 0; y <
height; y += 16) {
805 for (x = 0; x <
width; x += 16) {
823 int buf_size = avpkt->
size;
833 if (buf_size <
AV_RL32(buf + 4) + 8) {
841 if (frame_4cc ==
AV_RL32(
"cfrm")) {
853 whole_size =
AV_RL32(buf + 16);
855 if (data_size < 0 || whole_size < 0) {
872 if (i >= CFRAME_BUFFER_COUNT) {
889 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
892 if (cfrm->
size >= whole_size) {
894 frame_size = cfrm->
size;
903 cfrm->
size = cfrm->
id = 0;
909 frame_size = buf_size - 12;
915 if (frame_4cc ==
AV_RL32(
"ifr2")) {
921 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
927 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
933 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {