44 #define BLOCK_TYPE_VLC_BITS 5
45 #define ACDC_VLC_BITS 9
47 #define CFRAME_BUFFER_COUNT 100
52 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
54 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
56 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
58 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
62 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
64 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
66 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
68 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
80 static const int8_t
mv[256][2] = {
81 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
82 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
83 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
84 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
85 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
86 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
87 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
88 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
89 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
90 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
91 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
92 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
93 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
94 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
95 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
96 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
97 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
98 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
99 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
100 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
101 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
102 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
103 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
104 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
105 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
106 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
107 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
108 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
109 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
110 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
111 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
112 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
118 16, 15, 13, 19, 24, 31, 28, 17,
119 17, 23, 25, 31, 36, 63, 45, 21,
120 18, 24, 27, 37, 52, 59, 49, 20,
121 16, 28, 34, 40, 60, 80, 51, 20,
122 18, 31, 48, 66, 68, 86, 56, 21,
123 19, 38, 56, 59, 64, 64, 48, 20,
124 27, 48, 55, 55, 56, 51, 35, 15,
125 20, 35, 34, 32, 31, 22, 15, 8,
159 #define FIX_1_082392200 70936
160 #define FIX_1_414213562 92682
161 #define FIX_1_847759065 121095
162 #define FIX_2_613125930 171254
164 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
168 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
169 int tmp10, tmp11, tmp12, tmp13;
170 int z5, z10, z11, z12, z13;
174 for (
i = 0;
i < 8;
i++) {
181 tmp0 = tmp10 + tmp13;
182 tmp3 = tmp10 - tmp13;
183 tmp1 = tmp11 + tmp12;
184 tmp2 = tmp11 - tmp12;
202 temp[8 * 0 +
i] = tmp0 + tmp7;
203 temp[8 * 7 +
i] = tmp0 - tmp7;
204 temp[8 * 1 +
i] = tmp1 + tmp6;
205 temp[8 * 6 +
i] = tmp1 - tmp6;
206 temp[8 * 2 +
i] = tmp2 + tmp5;
207 temp[8 * 5 +
i] = tmp2 - tmp5;
208 temp[8 * 4 +
i] = tmp3 + tmp4;
209 temp[8 * 3 +
i] = tmp3 - tmp4;
212 for (
i = 0;
i < 8 * 8;
i += 8) {
219 tmp0 = tmp10 + tmp13;
220 tmp3 = tmp10 - tmp13;
221 tmp1 = tmp11 + tmp12;
222 tmp2 = tmp11 - tmp12;
240 block[0 +
i] = (tmp0 + tmp7) >> 6;
241 block[7 +
i] = (tmp0 - tmp7) >> 6;
242 block[1 +
i] = (tmp1 + tmp6) >> 6;
243 block[6 +
i] = (tmp1 - tmp6) >> 6;
244 block[2 +
i] = (tmp2 + tmp5) >> 6;
245 block[5 +
i] = (tmp2 - tmp5) >> 6;
246 block[4 +
i] = (tmp3 + tmp4) >> 6;
247 block[3 +
i] = (tmp3 - tmp4) >> 6;
255 for (
i = 0;
i < 2;
i++) {
256 for (j = 0; j < 4; j++) {
270 for (
i = 0;
i < 256;
i++) {
272 f->mv[
i] =
mv[
i][0] +
mv[
i][1] * linesize / 2;
274 f->mv[
i] = (
i & 15) - 8 + ((
i >> 4) - 8) * linesize / 2;
279 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
281 unsigned tmpval = AV_RN32(src); \
282 tmpval = (tmpval << 16) | (tmpval >> 16); \
283 tmpval = tmpval * (scale) + (dc); \
284 tmpval = (tmpval << 16) | (tmpval >> 16); \
285 AV_WN32A(dst, tmpval); \
288 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
290 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
291 AV_WN32A(dst, tmpval); \
295 static inline void mcdc(uint16_t *dst,
const uint16_t *
src,
int log2w,
303 for (
i = 0;
i <
h;
i++) {
311 for (
i = 0;
i <
h;
i++) {
319 for (
i = 0;
i <
h;
i++) {
328 for (
i = 0;
i <
h;
i++) {
344 int log2w,
int log2h,
int stride)
347 uint16_t *start, *end;
362 start =
f->last_frame_buffer;
363 end = start +
stride * (
f->avctx->height -
h + 1) - (1 << log2w);
372 }
else if (
code == 2) {
379 }
else if (
code == 6) {
385 dst[0] = bytestream2_get_le16u(&
f->g2);
386 dst[1] = bytestream2_get_le16u(&
f->g2);
388 dst[0] = bytestream2_get_le16u(&
f->g2);
389 dst[
stride] = bytestream2_get_le16u(&
f->g2);
400 src +=
f->mv[bytestream2_get_byte(&
f->g)];
401 }
else if (
code == 3 &&
f->version >= 2) {
403 }
else if (
code == 4) {
404 src +=
f->mv[bytestream2_get_byte(&
f->g)];
409 dc = bytestream2_get_le16(&
f->g2);
410 }
else if (
code == 5) {
417 dc = bytestream2_get_le16(&
f->g2);
420 if (start >
src ||
src > end) {
433 const int width =
f->avctx->width;
434 const int height =
f->avctx->height;
435 uint16_t *dst =
f->frame_buffer;
437 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
438 bytestream_offset, wordstream_offset;
441 src =
f->last_frame_buffer;
443 if (
f->version > 1) {
447 bitstream_size =
AV_RL32(buf + 8);
448 wordstream_size =
AV_RL32(buf + 12);
449 bytestream_size =
AV_RL32(buf + 16);
452 bitstream_size =
AV_RL16(buf - 4);
453 wordstream_size =
AV_RL16(buf - 2);
454 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
457 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
458 bytestream_size > length - bitstream_size ||
459 wordstream_size > length - bytestream_size - bitstream_size ||
460 extra > length - bytestream_size - bitstream_size - wordstream_size) {
461 av_log(
f->avctx,
AV_LOG_ERROR,
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
462 bitstream_size+ bytestream_size+ wordstream_size - length);
468 if (!
f->bitstream_buffer)
470 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (buf + extra),
474 wordstream_offset = extra + bitstream_size;
475 bytestream_offset = extra + bitstream_size + wordstream_size;
477 length - wordstream_offset);
479 length - bytestream_offset);
483 for (y = 0; y <
height; y += 8) {
484 for (x = 0; x <
width; x += 8)
559 int16_t (*
block)[64] =
f->block;
562 uint16_t *dst =
f->frame_buffer + y *
stride + x;
564 for (
i = 0;
i < 4;
i++) {
565 block[
i][0] += 0x80 * 8 * 8;
570 for (
i = 4;
i < 6;
i++)
578 for (y = 0; y < 8; y++) {
579 for (x = 0; x < 8; x++) {
580 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
581 2 * (x & 3) + 2 * 8 * (y & 3);
584 int cg = (
cb +
cr) >> 1;
590 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
592 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
594 dst[
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
596 dst[1 +
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
599 dst += 2 *
stride - 2 * 8;
608 f->bdsp.clear_blocks(
f->block[0]);
610 for (
i = 0;
i < 6;
i++)
618 const uint8_t *
const buf,
621 int frequency[512] = { 0 };
624 uint8_t len_tab[257];
627 const uint8_t *ptr = buf;
628 const uint8_t *ptr_end = buf + buf_size;
631 memset(up, -1,
sizeof(up));
638 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
643 for (
i = start;
i <= end;
i++)
644 frequency[
i] = *ptr++;
653 while ((ptr - buf) & 3)
661 for (j = 257; j < 512; j++) {
662 int min_freq[2] = { 256 * 256, 256 * 256 };
663 int smallest[2] = { 0, 0 };
665 for (
i = 0;
i < j;
i++) {
666 if (frequency[
i] == 0)
668 if (frequency[
i] < min_freq[1]) {
669 if (frequency[
i] < min_freq[0]) {
670 min_freq[1] = min_freq[0];
671 smallest[1] = smallest[0];
672 min_freq[0] = frequency[
i];
675 min_freq[1] = frequency[
i];
680 if (min_freq[1] == 256 * 256)
683 frequency[j] = min_freq[0] + min_freq[1];
684 flag[smallest[0]] = 0;
685 flag[smallest[1]] = 1;
688 frequency[smallest[0]] = frequency[smallest[1]] = 0;
691 for (j = 0; j < 257; j++) {
694 for (node = j; up[node] != -1; node = up[node]) {
700 "vlc length overflow\n");
717 int blue = 2 * (c0 & 0x001F) + (
c1 & 0x001F);
718 int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
719 int red = 2 * (c0 >> 10) + (
c1 >> 10);
720 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
726 const int width =
f->avctx->width;
727 const int height =
f->avctx->height;
729 uint16_t *dst =
f->frame_buffer;
730 const uint8_t *buf_end = buf + length;
733 if (length < mbs * 8) {
739 for (y = 0; y <
height; y += 16) {
740 for (x = 0; x <
width; x += 16) {
742 if (buf_end - buf < 8)
745 color[0] = bytestream2_get_le16u(&g3);
746 color[1] = bytestream2_get_le16u(&g3);
748 if (
color[0] & 0x8000)
750 if (
color[1] & 0x8000)
756 bits = bytestream2_get_le32u(&g3);
757 for (y2 = 0; y2 < 16; y2++) {
758 for (x2 = 0; x2 < 16; x2++) {
759 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
765 dst += 16 *
width - x;
774 const int width =
f->avctx->width;
775 const int height =
f->avctx->height;
776 const unsigned int bitstream_size =
AV_RL32(buf);
777 unsigned int prestream_size;
778 const uint8_t *prestream;
780 if (bitstream_size > (1 << 26))
783 if (length < bitstream_size + 12) {
788 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
789 prestream = buf + bitstream_size + 12;
791 if (prestream_size + bitstream_size + 12 != length
792 || prestream_size > (1 << 26)) {
794 prestream_size, bitstream_size, length);
808 prestream_size = length + buf - prestream;
812 if (!
f->bitstream_buffer)
814 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
818 f->last_dc = 0 * 128 * 8 * 8;
820 for (y = 0; y <
height; y += 16) {
821 for (x = 0; x <
width; x += 16) {
838 const uint8_t *buf = avpkt->
data;
839 int buf_size = avpkt->
size;
848 if (buf_size <
AV_RL32(buf + 4) + 8) {
856 if (frame_4cc ==
AV_RL32(
"cfrm")) {
859 const int data_size = buf_size - 20;
862 if (
f->version <= 1) {
868 whole_size =
AV_RL32(buf + 16);
870 if (data_size < 0 || whole_size < 0) {
881 if (
f->cfrm[
i].id ==
id)
883 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_")) {
966 (
const uint8_t*)
f->frame_buffer, avctx->
width * 2,
968 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
983 f->bitstream_buffer_size = 0;
986 f->cfrm[
i].allocated_size = 0;
1014 if (!
f->frame_buffer || !
f->last_frame_buffer)