45 #define BLOCK_TYPE_VLC_BITS 5
46 #define ACDC_VLC_BITS 9
48 #define CFRAME_BUFFER_COUNT 100
53 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
55 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
57 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
59 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
63 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
65 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
67 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
69 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
81 static const int8_t
mv[256][2] = {
82 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
83 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
84 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
85 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
86 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
87 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
88 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
89 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
90 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
91 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
92 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
93 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
94 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
95 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
96 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
97 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
98 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
99 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
100 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
101 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
102 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
103 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
104 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
105 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
106 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
107 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
108 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
109 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
110 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
111 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
112 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
113 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
119 16, 15, 13, 19, 24, 31, 28, 17,
120 17, 23, 25, 31, 36, 63, 45, 21,
121 18, 24, 27, 37, 52, 59, 49, 20,
122 16, 28, 34, 40, 60, 80, 51, 20,
123 18, 31, 48, 66, 68, 86, 56, 21,
124 19, 38, 56, 59, 64, 64, 48, 20,
125 27, 48, 55, 55, 56, 51, 35, 15,
126 20, 35, 34, 32, 31, 22, 15, 8,
160 #define FIX_1_082392200 70936
161 #define FIX_1_414213562 92682
162 #define FIX_1_847759065 121095
163 #define FIX_2_613125930 171254
165 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
169 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
170 int tmp10, tmp11, tmp12, tmp13;
171 int z5, z10, z11, z12, z13;
175 for (
i = 0;
i < 8;
i++) {
182 tmp0 = tmp10 + tmp13;
183 tmp3 = tmp10 - tmp13;
184 tmp1 = tmp11 + tmp12;
185 tmp2 = tmp11 - tmp12;
203 temp[8 * 0 +
i] = tmp0 + tmp7;
204 temp[8 * 7 +
i] = tmp0 - tmp7;
205 temp[8 * 1 +
i] = tmp1 + tmp6;
206 temp[8 * 6 +
i] = tmp1 - tmp6;
207 temp[8 * 2 +
i] = tmp2 + tmp5;
208 temp[8 * 5 +
i] = tmp2 - tmp5;
209 temp[8 * 4 +
i] = tmp3 + tmp4;
210 temp[8 * 3 +
i] = tmp3 - tmp4;
213 for (
i = 0;
i < 8 * 8;
i += 8) {
220 tmp0 = tmp10 + tmp13;
221 tmp3 = tmp10 - tmp13;
222 tmp1 = tmp11 + tmp12;
223 tmp2 = tmp11 - tmp12;
241 block[0 +
i] = (tmp0 + tmp7) >> 6;
242 block[7 +
i] = (tmp0 - tmp7) >> 6;
243 block[1 +
i] = (tmp1 + tmp6) >> 6;
244 block[6 +
i] = (tmp1 - tmp6) >> 6;
245 block[2 +
i] = (tmp2 + tmp5) >> 6;
246 block[5 +
i] = (tmp2 - tmp5) >> 6;
247 block[4 +
i] = (tmp3 + tmp4) >> 6;
248 block[3 +
i] = (tmp3 - tmp4) >> 6;
256 for (
i = 0;
i < 2;
i++) {
257 for (j = 0; j < 4; j++) {
271 for (
i = 0;
i < 256;
i++) {
273 f->mv[
i] =
mv[
i][0] +
mv[
i][1] * linesize / 2;
275 f->mv[
i] = (
i & 15) - 8 + ((
i >> 4) - 8) * linesize / 2;
280 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
282 unsigned tmpval = AV_RN32(src); \
283 tmpval = (tmpval << 16) | (tmpval >> 16); \
284 tmpval = tmpval * (scale) + (dc); \
285 tmpval = (tmpval << 16) | (tmpval >> 16); \
286 AV_WN32A(dst, tmpval); \
289 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
291 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
292 AV_WN32A(dst, tmpval); \
296 static inline void mcdc(uint16_t *
dst,
const uint16_t *
src,
int log2w,
304 for (
i = 0;
i <
h;
i++) {
312 for (
i = 0;
i <
h;
i++) {
320 for (
i = 0;
i <
h;
i++) {
329 for (
i = 0;
i <
h;
i++) {
345 int log2w,
int log2h,
int stride)
348 uint16_t *start, *end;
363 start =
f->last_frame_buffer;
364 end = start +
stride * (
f->avctx->height -
h + 1) - (1 << log2w);
373 }
else if (
code == 2) {
380 }
else if (
code == 6) {
386 dst[0] = bytestream2_get_le16u(&
f->g2);
387 dst[1] = bytestream2_get_le16u(&
f->g2);
389 dst[0] = bytestream2_get_le16u(&
f->g2);
401 src +=
f->mv[bytestream2_get_byte(&
f->g)];
402 }
else if (
code == 3 &&
f->version >= 2) {
404 }
else if (
code == 4) {
405 src +=
f->mv[bytestream2_get_byte(&
f->g)];
410 dc = bytestream2_get_le16(&
f->g2);
411 }
else if (
code == 5) {
418 dc = bytestream2_get_le16(&
f->g2);
421 if (start >
src ||
src > end) {
434 const int width =
f->avctx->width;
435 const int height =
f->avctx->height;
436 uint16_t *
dst =
f->frame_buffer;
438 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
439 bytestream_offset, wordstream_offset;
442 src =
f->last_frame_buffer;
444 if (
f->version > 1) {
448 bitstream_size =
AV_RL32(buf + 8);
449 wordstream_size =
AV_RL32(buf + 12);
450 bytestream_size =
AV_RL32(buf + 16);
453 bitstream_size =
AV_RL16(buf - 4);
454 wordstream_size =
AV_RL16(buf - 2);
455 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
458 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
459 bytestream_size > length - bitstream_size ||
460 wordstream_size > length - bytestream_size - bitstream_size ||
461 extra > length - bytestream_size - bitstream_size - wordstream_size) {
462 av_log(
f->avctx,
AV_LOG_ERROR,
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
463 bitstream_size+ bytestream_size+ wordstream_size - length);
469 if (!
f->bitstream_buffer)
471 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (buf + extra),
475 wordstream_offset = extra + bitstream_size;
476 bytestream_offset = extra + bitstream_size + wordstream_size;
478 length - wordstream_offset);
480 length - bytestream_offset);
484 for (y = 0; y <
height; y += 8) {
485 for (x = 0; x <
width; x += 8)
560 int16_t (*
block)[64] =
f->block;
563 uint16_t *
dst =
f->frame_buffer + y *
stride + x;
565 for (
i = 0;
i < 4;
i++) {
566 block[
i][0] += 0x80 * 8 * 8;
571 for (
i = 4;
i < 6;
i++)
579 for (y = 0; y < 8; y++) {
580 for (x = 0; x < 8; x++) {
581 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
582 2 * (x & 3) + 2 * 8 * (y & 3);
585 int cg = (
cb +
cr) >> 1;
591 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
593 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
595 dst[
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
597 dst[1 +
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
609 f->bdsp.clear_blocks(
f->block[0]);
611 for (
i = 0;
i < 6;
i++)
619 const uint8_t *
const buf,
622 int frequency[512] = { 0 };
625 uint8_t len_tab[257];
628 const uint8_t *ptr = buf;
629 const uint8_t *ptr_end = buf + buf_size;
632 memset(up, -1,
sizeof(up));
639 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
644 for (
i = start;
i <= end;
i++)
645 frequency[
i] = *ptr++;
654 while ((ptr - buf) & 3)
662 for (j = 257; j < 512; j++) {
663 int min_freq[2] = { 256 * 256, 256 * 256 };
664 int smallest[2] = { 0, 0 };
666 for (
i = 0;
i < j;
i++) {
667 if (frequency[
i] == 0)
669 if (frequency[
i] < min_freq[1]) {
670 if (frequency[
i] < min_freq[0]) {
671 min_freq[1] = min_freq[0];
672 smallest[1] = smallest[0];
673 min_freq[0] = frequency[
i];
676 min_freq[1] = frequency[
i];
681 if (min_freq[1] == 256 * 256)
684 frequency[j] = min_freq[0] + min_freq[1];
685 flag[smallest[0]] = 0;
686 flag[smallest[1]] = 1;
689 frequency[smallest[0]] = frequency[smallest[1]] = 0;
692 for (j = 0; j < 257; j++) {
695 for (node = j; up[node] != -1; node = up[node]) {
701 "vlc length overflow\n");
718 int blue = 2 * (c0 & 0x001F) + (
c1 & 0x001F);
719 int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
720 int red = 2 * (c0 >> 10) + (
c1 >> 10);
721 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
727 const int width =
f->avctx->width;
728 const int height =
f->avctx->height;
730 uint16_t *
dst =
f->frame_buffer;
731 const uint8_t *buf_end = buf + length;
734 if (length < mbs * 8) {
740 for (y = 0; y <
height; y += 16) {
741 for (x = 0; x <
width; x += 16) {
743 if (buf_end - buf < 8)
746 color[0] = bytestream2_get_le16u(&g3);
747 color[1] = bytestream2_get_le16u(&g3);
749 if (
color[0] & 0x8000)
751 if (
color[1] & 0x8000)
757 bits = bytestream2_get_le32u(&g3);
758 for (y2 = 0; y2 < 16; y2++) {
759 for (x2 = 0; x2 < 16; x2++) {
760 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
775 const int width =
f->avctx->width;
776 const int height =
f->avctx->height;
777 const unsigned int bitstream_size =
AV_RL32(buf);
778 unsigned int prestream_size;
779 const uint8_t *prestream;
781 if (bitstream_size > (1 << 26))
784 if (length < bitstream_size + 12) {
789 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
790 prestream = buf + bitstream_size + 12;
792 if (prestream_size + bitstream_size + 12 != length
793 || prestream_size > (1 << 26)) {
795 prestream_size, bitstream_size, length);
809 prestream_size = length + buf - prestream;
813 if (!
f->bitstream_buffer)
815 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
819 f->last_dc = 0 * 128 * 8 * 8;
821 for (y = 0; y <
height; y += 16) {
822 for (x = 0; x <
width; x += 16) {
839 const uint8_t *buf = avpkt->
data;
840 int buf_size = avpkt->
size;
849 if (buf_size <
AV_RL32(buf + 4) + 8) {
857 if (frame_4cc ==
AV_RL32(
"cfrm")) {
860 const int data_size = buf_size - 20;
863 if (
f->version <= 1) {
869 whole_size =
AV_RL32(buf + 16);
871 if (data_size < 0 || whole_size < 0) {
882 if (
f->cfrm[
i].id ==
id)
884 if (
f->cfrm[
i].size == 0)
907 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
908 cfrm->
size += data_size;
910 if (cfrm->
size >= whole_size) {
921 cfrm->
size = cfrm->
id = 0;
933 if (frame_4cc ==
AV_RL32(
"ifr2")) {
939 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
945 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
951 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {
967 (
const uint8_t*)
f->frame_buffer, avctx->
width * 2,
969 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
984 f->bitstream_buffer_size = 0;
987 f->cfrm[
i].allocated_size = 0;
1015 if (!
f->frame_buffer || !
f->last_frame_buffer)