41 #define BLOCK_TYPE_VLC_BITS 5
42 #define ACDC_VLC_BITS 9
44 #define CFRAME_BUFFER_COUNT 100
49 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
51 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
53 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
55 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
59 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
61 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
63 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
65 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
77 static const int8_t
mv[256][2] = {
78 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
79 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
80 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
81 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
82 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
83 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
84 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
85 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
86 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
87 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
88 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
89 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
90 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
91 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
92 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
93 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
94 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
95 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
96 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
97 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
98 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
99 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
100 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
101 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
102 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
103 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
104 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
105 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
106 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
107 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
108 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
109 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
115 16, 15, 13, 19, 24, 31, 28, 17,
116 17, 23, 25, 31, 36, 63, 45, 21,
117 18, 24, 27, 37, 52, 59, 49, 20,
118 16, 28, 34, 40, 60, 80, 51, 20,
119 18, 31, 48, 66, 68, 86, 56, 21,
120 19, 38, 56, 59, 64, 64, 48, 20,
121 27, 48, 55, 55, 56, 51, 35, 15,
122 20, 35, 34, 32, 31, 22, 15, 8,
156 #define FIX_1_082392200 70936
157 #define FIX_1_414213562 92682
158 #define FIX_1_847759065 121095
159 #define FIX_2_613125930 171254
161 #define MULTIPLY(var, const) (((var) * (const)) >> 16)
165 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
166 int tmp10, tmp11, tmp12, tmp13;
167 int z5, z10, z11, z12, z13;
171 for (i = 0; i < 8; i++) {
172 tmp10 = block[8 * 0 + i] + block[8 * 4 + i];
173 tmp11 = block[8 * 0 + i] - block[8 * 4 + i];
175 tmp13 = block[8 * 2 + i] + block[8 * 6 + i];
178 tmp0 = tmp10 + tmp13;
179 tmp3 = tmp10 - tmp13;
180 tmp1 = tmp11 + tmp12;
181 tmp2 = tmp11 - tmp12;
183 z13 = block[8 * 5 + i] + block[8 * 3 + i];
184 z10 = block[8 * 5 + i] - block[8 * 3 + i];
185 z11 = block[8 * 1 + i] + block[8 * 7 + i];
186 z12 = block[8 * 1 + i] - block[8 * 7 + i];
199 temp[8 * 0 + i] = tmp0 + tmp7;
200 temp[8 * 7 + i] = tmp0 - tmp7;
201 temp[8 * 1 + i] = tmp1 + tmp6;
202 temp[8 * 6 + i] = tmp1 - tmp6;
203 temp[8 * 2 + i] = tmp2 + tmp5;
204 temp[8 * 5 + i] = tmp2 - tmp5;
205 temp[8 * 4 + i] = tmp3 + tmp4;
206 temp[8 * 3 + i] = tmp3 - tmp4;
209 for (i = 0; i < 8 * 8; i += 8) {
210 tmp10 = temp[0 + i] + temp[4 + i];
211 tmp11 = temp[0 + i] - temp[4 + i];
213 tmp13 = temp[2 + i] + temp[6 + i];
216 tmp0 = tmp10 + tmp13;
217 tmp3 = tmp10 - tmp13;
218 tmp1 = tmp11 + tmp12;
219 tmp2 = tmp11 - tmp12;
221 z13 = temp[5 + i] + temp[3 + i];
222 z10 = temp[5 + i] - temp[3 + i];
223 z11 = temp[1 + i] + temp[7 + i];
224 z12 = temp[1 + i] - temp[7 + i];
237 block[0 + i] = (tmp0 + tmp7) >> 6;
238 block[7 + i] = (tmp0 - tmp7) >> 6;
239 block[1 + i] = (tmp1 + tmp6) >> 6;
240 block[6 + i] = (tmp1 - tmp6) >> 6;
241 block[2 + i] = (tmp2 + tmp5) >> 6;
242 block[5 + i] = (tmp2 - tmp5) >> 6;
243 block[4 + i] = (tmp3 + tmp4) >> 6;
244 block[3 + i] = (tmp3 - tmp4) >> 6;
253 for (i = 0; i < 2; i++) {
254 for (j = 0; j < 4; j++) {
255 block_type_vlc[i][j].
table = table[i][j];
269 for (i = 0; i < 256; i++) {
271 f->
mv[i] =
mv[i][0] +
mv[i][1] * linesize / 2;
273 f->
mv[i] = (i & 15) - 8 + ((i >> 4) - 8) * linesize / 2;
278 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
280 unsigned tmpval = AV_RN32(src); \
281 tmpval = (tmpval << 16) | (tmpval >> 16); \
282 tmpval = tmpval * (scale) + (dc); \
283 tmpval = (tmpval << 16) | (tmpval >> 16); \
284 AV_WN32A(dst, tmpval); \
287 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
289 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
290 AV_WN32A(dst, tmpval); \
294 static inline void mcdc(uint16_t *dst,
const uint16_t *
src,
int log2w,
295 int h,
int stride,
int scale,
unsigned dc)
302 for (i = 0; i < h; i++) {
303 dst[0] = scale * src[0] +
dc;
310 for (i = 0; i < h; i++) {
318 for (i = 0; i < h; i++) {
327 for (i = 0; i < h; i++) {
343 int log2w,
int log2h,
int stride)
346 const int h = 1 << log2h;
351 uint16_t *
end = start + stride * (f->
avctx->
height - h + 1) - (1 << log2w);
356 av_assert0(code >= 0 && code <= 6 && log2w >= 0);
360 if ((ret =
decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
363 src + (stride << log2h),
364 log2w, log2h, stride);
365 }
else if (code == 2) {
367 if ((ret =
decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
371 log2w, log2h, stride);
372 }
else if (code == 6) {
378 dst[0] = bytestream2_get_le16u(&f->
g2);
379 dst[1] = bytestream2_get_le16u(&f->
g2);
381 dst[0] = bytestream2_get_le16u(&f->
g2);
382 dst[stride] = bytestream2_get_le16u(&f->
g2);
393 src += f->
mv[bytestream2_get_byte(&f->
g)];
394 }
else if (code == 3 && f->
version >= 2) {
396 }
else if (code == 4) {
397 src += f->
mv[bytestream2_get_byte(&f->
g)];
402 dc = bytestream2_get_le16(&f->
g2);
403 }
else if (code == 5) {
410 dc = bytestream2_get_le16(&f->
g2);
413 if (start > src || src > end) {
418 mcdc(dst, src, log2w, h, stride, scale, dc);
430 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
431 bytestream_offset, wordstream_offset;
440 bitstream_size =
AV_RL32(buf + 8);
441 wordstream_size =
AV_RL32(buf + 12);
442 bytestream_size =
AV_RL32(buf + 16);
445 bitstream_size =
AV_RL16(buf - 4);
446 wordstream_size =
AV_RL16(buf - 2);
447 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
450 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
451 bytestream_size > length - bitstream_size ||
452 wordstream_size > length - bytestream_size - bitstream_size ||
453 extra > length - bytestream_size - bitstream_size - wordstream_size) {
455 bitstream_size+ bytestream_size+ wordstream_size - length);
467 wordstream_offset = extra + bitstream_size;
468 bytestream_offset = extra + bitstream_size + wordstream_size;
470 length - wordstream_offset);
472 length - bytestream_offset);
476 for (y = 0; y <
height; y += 8) {
477 for (x = 0; x <
width; x += 8)
553 for (i = 0; i < 4; i++) {
554 block[i][0] += 0x80 * 8 * 8;
559 for (i = 4; i < 6; i++)
567 for (y = 0; y < 8; y++) {
568 for (x = 0; x < 8; x++) {
569 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
570 2 * (x & 3) + 2 * 8 * (y & 3);
573 int cg = (cb +
cr) >> 1;
579 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
581 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
583 dst[stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
585 dst[1 + stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
588 dst += 2 * stride - 2 * 8;
599 for (i = 0; i < 6; i++)
610 int frequency[512] = { 0 };
617 const uint8_t *ptr_end = buf + buf_size;
620 memset(up, -1,
sizeof(up));
627 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
632 for (i = start; i <=
end; i++)
633 frequency[i] = *ptr++;
642 while ((ptr - buf) & 3)
650 for (j = 257; j < 512; j++) {
651 int min_freq[2] = { 256 * 256, 256 * 256 };
652 int smallest[2] = { 0, 0 };
654 for (i = 0; i < j; i++) {
655 if (frequency[i] == 0)
657 if (frequency[i] < min_freq[1]) {
658 if (frequency[i] < min_freq[0]) {
659 min_freq[1] = min_freq[0];
660 smallest[1] = smallest[0];
661 min_freq[0] = frequency[i];
664 min_freq[1] = frequency[i];
669 if (min_freq[1] == 256 * 256)
672 frequency[j] = min_freq[0] + min_freq[1];
673 flag[smallest[0]] = 0;
674 flag[smallest[1]] = 1;
677 frequency[smallest[0]] = frequency[smallest[1]] = 0;
680 for (j = 0; j < 257; j++) {
683 for (node = j; up[node] != -1; node = up[node]) {
689 "vlc length overflow\n");
705 int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
706 int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
707 int red = 2 * (c0 >> 10) + (c1 >> 10);
708 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
716 const int mbs = (
FFALIGN(width, 16) >> 4) * (
FFALIGN(height, 16) >> 4);
721 if (length < mbs * 8) {
727 for (y = 0; y <
height; y += 16) {
728 for (x = 0; x <
width; x += 16) {
730 if (buf_end - buf < 8)
733 color[0] = bytestream2_get_le16u(&g3);
734 color[1] = bytestream2_get_le16u(&g3);
736 if (color[0] & 0x8000)
738 if (color[1] & 0x8000)
741 color[2] =
mix(color[0], color[1]);
742 color[3] =
mix(color[1], color[0]);
744 bits = bytestream2_get_le32u(&g3);
745 for (y2 = 0; y2 < 16; y2++) {
746 for (x2 = 0; x2 < 16; x2++) {
747 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
748 dst[y2 * width + x2] = color[(
bits >>
index) & 3];
753 dst += 16 * width - x;
764 const unsigned int bitstream_size =
AV_RL32(buf);
765 unsigned int prestream_size;
768 if (bitstream_size > (1 << 26))
771 if (length < bitstream_size + 12) {
776 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
777 prestream = buf + bitstream_size + 12;
779 if (prestream_size + bitstream_size + 12 != length
780 || prestream_size > (1 << 26)) {
782 prestream_size, bitstream_size, length);
796 prestream_size = length + buf - prestream;
808 for (y = 0; y <
height; y += 16) {
809 for (x = 0; x <
width; x += 16) {
827 int buf_size = avpkt->
size;
837 if (buf_size <
AV_RL32(buf + 4) + 8) {
845 if (frame_4cc ==
AV_RL32(
"cfrm")) {
848 const int data_size = buf_size - 20;
857 whole_size =
AV_RL32(buf + 16);
859 if (data_size < 0 || whole_size < 0) {
876 if (i >= CFRAME_BUFFER_COUNT) {
893 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
894 cfrm->
size += data_size;
896 if (cfrm->
size >= whole_size) {
898 frame_size = cfrm->
size;
907 cfrm->
size = cfrm->
id = 0;
913 frame_size = buf_size - 12;
919 if (frame_4cc ==
AV_RL32(
"ifr2")) {
925 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
931 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
937 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {