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)
360 end = start + stride * (f->
avctx->
height - h + 1) - (1 << log2w);
364 if ((ret =
decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
367 src + (stride << log2h),
368 log2w, log2h, stride);
369 }
else if (code == 2) {
371 if ((ret =
decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
375 log2w, log2h, stride);
376 }
else if (code == 6) {
382 dst[0] = bytestream2_get_le16u(&f->
g2);
383 dst[1] = bytestream2_get_le16u(&f->
g2);
385 dst[0] = bytestream2_get_le16u(&f->
g2);
386 dst[stride] = bytestream2_get_le16u(&f->
g2);
397 src += f->
mv[bytestream2_get_byte(&f->
g)];
398 }
else if (code == 3 && f->
version >= 2) {
400 }
else if (code == 4) {
401 src += f->
mv[bytestream2_get_byte(&f->
g)];
406 dc = bytestream2_get_le16(&f->
g2);
407 }
else if (code == 5) {
414 dc = bytestream2_get_le16(&f->
g2);
417 if (start > src || src > end) {
422 mcdc(dst, src, log2w, h, stride, scale, dc);
434 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
435 bytestream_offset, wordstream_offset;
444 bitstream_size =
AV_RL32(buf + 8);
445 wordstream_size =
AV_RL32(buf + 12);
446 bytestream_size =
AV_RL32(buf + 16);
449 bitstream_size =
AV_RL16(buf - 4);
450 wordstream_size =
AV_RL16(buf - 2);
451 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
454 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
455 bytestream_size > length - bitstream_size ||
456 wordstream_size > length - bytestream_size - bitstream_size ||
457 extra > length - bytestream_size - bitstream_size - wordstream_size) {
459 bitstream_size+ bytestream_size+ wordstream_size - length);
471 wordstream_offset = extra + bitstream_size;
472 bytestream_offset = extra + bitstream_size + wordstream_size;
474 length - wordstream_offset);
476 length - bytestream_offset);
480 for (y = 0; y <
height; y += 8) {
481 for (x = 0; x <
width; x += 8)
557 for (i = 0; i < 4; i++) {
558 block[i][0] += 0x80 * 8 * 8;
563 for (i = 4; i < 6; i++)
571 for (y = 0; y < 8; y++) {
572 for (x = 0; x < 8; x++) {
573 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
574 2 * (x & 3) + 2 * 8 * (y & 3);
577 int cg = (cb +
cr) >> 1;
583 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
585 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
587 dst[stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
589 dst[1 + stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
592 dst += 2 * stride - 2 * 8;
603 for (i = 0; i < 6; i++)
614 int frequency[512] = { 0 };
621 const uint8_t *ptr_end = buf + buf_size;
624 memset(up, -1,
sizeof(up));
631 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
636 for (i = start; i <=
end; i++)
637 frequency[i] = *ptr++;
646 while ((ptr - buf) & 3)
654 for (j = 257; j < 512; j++) {
655 int min_freq[2] = { 256 * 256, 256 * 256 };
656 int smallest[2] = { 0, 0 };
658 for (i = 0; i < j; i++) {
659 if (frequency[i] == 0)
661 if (frequency[i] < min_freq[1]) {
662 if (frequency[i] < min_freq[0]) {
663 min_freq[1] = min_freq[0];
664 smallest[1] = smallest[0];
665 min_freq[0] = frequency[i];
668 min_freq[1] = frequency[i];
673 if (min_freq[1] == 256 * 256)
676 frequency[j] = min_freq[0] + min_freq[1];
677 flag[smallest[0]] = 0;
678 flag[smallest[1]] = 1;
681 frequency[smallest[0]] = frequency[smallest[1]] = 0;
684 for (j = 0; j < 257; j++) {
687 for (node = j; up[node] != -1; node = up[node]) {
693 "vlc length overflow\n");
709 int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
710 int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
711 int red = 2 * (c0 >> 10) + (c1 >> 10);
712 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
720 const int mbs = (
FFALIGN(width, 16) >> 4) * (
FFALIGN(height, 16) >> 4);
725 if (length < mbs * 8) {
731 for (y = 0; y <
height; y += 16) {
732 for (x = 0; x <
width; x += 16) {
734 if (buf_end - buf < 8)
737 color[0] = bytestream2_get_le16u(&g3);
738 color[1] = bytestream2_get_le16u(&g3);
740 if (color[0] & 0x8000)
742 if (color[1] & 0x8000)
745 color[2] =
mix(color[0], color[1]);
746 color[3] =
mix(color[1], color[0]);
748 bits = bytestream2_get_le32u(&g3);
749 for (y2 = 0; y2 < 16; y2++) {
750 for (x2 = 0; x2 < 16; x2++) {
751 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
752 dst[y2 * width + x2] = color[(
bits >>
index) & 3];
757 dst += 16 * width - x;
768 const unsigned int bitstream_size =
AV_RL32(buf);
769 unsigned int prestream_size;
772 if (bitstream_size > (1 << 26))
775 if (length < bitstream_size + 12) {
780 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
781 prestream = buf + bitstream_size + 12;
783 if (prestream_size + bitstream_size + 12 != length
784 || prestream_size > (1 << 26)) {
786 prestream_size, bitstream_size, length);
800 prestream_size = length + buf - prestream;
812 for (y = 0; y <
height; y += 16) {
813 for (x = 0; x <
width; x += 16) {
831 int buf_size = avpkt->
size;
841 if (buf_size <
AV_RL32(buf + 4) + 8) {
849 if (frame_4cc ==
AV_RL32(
"cfrm")) {
852 const int data_size = buf_size - 20;
861 whole_size =
AV_RL32(buf + 16);
863 if (data_size < 0 || whole_size < 0) {
880 if (i >= CFRAME_BUFFER_COUNT) {
897 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
898 cfrm->
size += data_size;
900 if (cfrm->
size >= whole_size) {
902 frame_size = cfrm->
size;
911 cfrm->
size = cfrm->
id = 0;
917 frame_size = buf_size - 12;
923 if (frame_4cc ==
AV_RL32(
"ifr2")) {
929 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
935 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
941 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {