43 #define BLOCK_TYPE_VLC_BITS 5
44 #define ACDC_VLC_BITS 9
46 #define CFRAME_BUFFER_COUNT 100
51 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
53 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
55 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
57 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
61 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
63 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
65 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
67 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
79 static const int8_t
mv[256][2] = {
80 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
81 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
82 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
83 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
84 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
85 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
86 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
87 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
88 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
89 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
90 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
91 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
92 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
93 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
94 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
95 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
96 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
97 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
98 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
99 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
100 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
101 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
102 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
103 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
104 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
105 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
106 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
107 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
108 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
109 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
110 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
111 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
117 16, 15, 13, 19, 24, 31, 28, 17,
118 17, 23, 25, 31, 36, 63, 45, 21,
119 18, 24, 27, 37, 52, 59, 49, 20,
120 16, 28, 34, 40, 60, 80, 51, 20,
121 18, 31, 48, 66, 68, 86, 56, 21,
122 19, 38, 56, 59, 64, 64, 48, 20,
123 27, 48, 55, 55, 56, 51, 35, 15,
124 20, 35, 34, 32, 31, 22, 15, 8,
158 #define FIX_1_082392200 70936
159 #define FIX_1_414213562 92682
160 #define FIX_1_847759065 121095
161 #define FIX_2_613125930 171254
163 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
167 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
168 int tmp10, tmp11, tmp12, tmp13;
169 int z5, z10, z11, z12, z13;
173 for (
i = 0;
i < 8;
i++) {
180 tmp0 = tmp10 + tmp13;
181 tmp3 = tmp10 - tmp13;
182 tmp1 = tmp11 + tmp12;
183 tmp2 = tmp11 - tmp12;
201 temp[8 * 0 +
i] = tmp0 + tmp7;
202 temp[8 * 7 +
i] = tmp0 - tmp7;
203 temp[8 * 1 +
i] = tmp1 + tmp6;
204 temp[8 * 6 +
i] = tmp1 - tmp6;
205 temp[8 * 2 +
i] = tmp2 + tmp5;
206 temp[8 * 5 +
i] = tmp2 - tmp5;
207 temp[8 * 4 +
i] = tmp3 + tmp4;
208 temp[8 * 3 +
i] = tmp3 - tmp4;
211 for (
i = 0;
i < 8 * 8;
i += 8) {
218 tmp0 = tmp10 + tmp13;
219 tmp3 = tmp10 - tmp13;
220 tmp1 = tmp11 + tmp12;
221 tmp2 = tmp11 - tmp12;
239 block[0 +
i] = (tmp0 + tmp7) >> 6;
240 block[7 +
i] = (tmp0 - tmp7) >> 6;
241 block[1 +
i] = (tmp1 + tmp6) >> 6;
242 block[6 +
i] = (tmp1 - tmp6) >> 6;
243 block[2 +
i] = (tmp2 + tmp5) >> 6;
244 block[5 +
i] = (tmp2 - tmp5) >> 6;
245 block[4 +
i] = (tmp3 + tmp4) >> 6;
246 block[3 +
i] = (tmp3 - tmp4) >> 6;
255 for (
i = 0;
i < 2;
i++) {
256 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);
390 dst[
stride] = 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);
600 dst += 2 *
stride - 2 * 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);
766 dst += 16 *
width - x;
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;
850 if (buf_size <
AV_RL32(buf + 4) + 8) {
858 if (frame_4cc ==
AV_RL32(
"cfrm")) {
861 const int data_size = buf_size - 20;
864 if (
f->version <= 1) {
870 whole_size =
AV_RL32(buf + 16);
872 if (data_size < 0 || whole_size < 0) {
883 if (
f->cfrm[
i].id ==
id)
885 if (
f->cfrm[
i].size == 0)
906 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
907 cfrm->
size += data_size;
909 if (cfrm->
size >= whole_size) {
920 cfrm->
size = cfrm->
id = 0;
932 if (frame_4cc ==
AV_RL32(
"ifr2")) {
938 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
944 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
950 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {
961 (
const uint8_t*)
f->frame_buffer, avctx->
width * 2,
963 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
980 f->bitstream_buffer_size = 0;
983 f->cfrm[
i].allocated_size = 0;
1011 if (!
f->frame_buffer || !
f->last_frame_buffer) {