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) ((int)((var) * (unsigned)(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++) {
178 tmp0 = tmp10 + tmp13;
179 tmp3 = tmp10 - tmp13;
180 tmp1 = tmp11 + tmp12;
181 tmp2 = tmp11 - tmp12;
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) {
216 tmp0 = tmp10 + tmp13;
217 tmp3 = tmp10 - tmp13;
218 tmp1 = tmp11 + tmp12;
219 tmp2 = tmp11 - tmp12;
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++) {
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)
361 start =
f->last_frame_buffer;
371 }
else if (
code == 2) {
378 }
else if (
code == 6) {
384 dst[0] = bytestream2_get_le16u(&
f->g2);
385 dst[1] = bytestream2_get_le16u(&
f->g2);
387 dst[0] = bytestream2_get_le16u(&
f->g2);
388 dst[
stride] = bytestream2_get_le16u(&
f->g2);
399 src +=
f->mv[bytestream2_get_byte(&
f->g)];
400 }
else if (
code == 3 &&
f->version >= 2) {
402 }
else if (
code == 4) {
403 src +=
f->mv[bytestream2_get_byte(&
f->g)];
408 dc = bytestream2_get_le16(&
f->g2);
409 }
else if (
code == 5) {
416 dc = bytestream2_get_le16(&
f->g2);
432 const int width =
f->avctx->width;
433 const int height =
f->avctx->height;
434 uint16_t *dst =
f->frame_buffer;
436 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
437 bytestream_offset, wordstream_offset;
440 src =
f->last_frame_buffer;
442 if (
f->version > 1) {
453 bytestream_size =
FFMAX(
length - bitstream_size - wordstream_size, 0);
456 if (bitstream_size >
length || bitstream_size >= INT_MAX/8 ||
457 bytestream_size >
length - bitstream_size ||
458 wordstream_size >
length - bytestream_size - bitstream_size ||
459 extra >
length - bytestream_size - bitstream_size - wordstream_size) {
460 av_log(
f->avctx,
AV_LOG_ERROR,
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
461 bitstream_size+ bytestream_size+ wordstream_size -
length);
467 if (!
f->bitstream_buffer)
469 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (
buf + extra),
473 wordstream_offset = extra + bitstream_size;
474 bytestream_offset = extra + bitstream_size + wordstream_size;
476 length - wordstream_offset);
478 length - bytestream_offset);
482 for (y = 0; y <
height; y += 8) {
483 for (x = 0; x <
width; x += 8)
558 int16_t (*
block)[64] =
f->block;
561 uint16_t *dst =
f->frame_buffer + y *
stride + x;
563 for (
i = 0;
i < 4;
i++) {
564 block[
i][0] += 0x80 * 8 * 8;
569 for (
i = 4;
i < 6;
i++)
577 for (y = 0; y < 8; y++) {
578 for (x = 0; x < 8; x++) {
579 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
580 2 * (x & 3) + 2 * 8 * (y & 3);
583 int cg = (
cb +
cr) >> 1;
589 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
591 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
593 dst[
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
595 dst[1 +
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
598 dst += 2 *
stride - 2 * 8;
607 f->bdsp.clear_blocks(
f->block[0]);
609 for (
i = 0;
i < 6;
i++)
620 int frequency[512] = { 0 };
630 memset(up, -1,
sizeof(up));
643 frequency[
i] = *ptr++;
652 while ((ptr -
buf) & 3)
660 for (j = 257; j < 512; j++) {
661 int min_freq[2] = { 256 * 256, 256 * 256 };
662 int smallest[2] = { 0, 0 };
664 for (
i = 0;
i < j;
i++) {
665 if (frequency[
i] == 0)
667 if (frequency[
i] < min_freq[1]) {
668 if (frequency[
i] < min_freq[0]) {
669 min_freq[1] = min_freq[0];
670 smallest[1] = smallest[0];
671 min_freq[0] = frequency[
i];
674 min_freq[1] = frequency[
i];
679 if (min_freq[1] == 256 * 256)
682 frequency[j] = min_freq[0] + min_freq[1];
683 flag[smallest[0]] = 0;
684 flag[smallest[1]] = 1;
687 frequency[smallest[0]] = frequency[smallest[1]] = 0;
690 for (j = 0; j < 257; j++) {
693 for (node = j; up[node] != -1; node = up[node]) {
699 "vlc length overflow\n");
716 int blue = 2 * (c0 & 0x001F) + (
c1 & 0x001F);
717 int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
718 int red = 2 * (c0 >> 10) + (
c1 >> 10);
719 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
725 const int width =
f->avctx->width;
726 const int height =
f->avctx->height;
728 uint16_t *dst =
f->frame_buffer;
738 for (y = 0; y <
height; y += 16) {
739 for (x = 0; x <
width; x += 16) {
741 if (buf_end -
buf < 8)
744 color[0] = bytestream2_get_le16u(&g3);
745 color[1] = bytestream2_get_le16u(&g3);
747 if (
color[0] & 0x8000)
749 if (
color[1] & 0x8000)
755 bits = bytestream2_get_le32u(&g3);
756 for (y2 = 0; y2 < 16; y2++) {
757 for (x2 = 0; x2 < 16; x2++) {
758 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
764 dst += 16 *
width - x;
773 const int width =
f->avctx->width;
774 const int height =
f->avctx->height;
775 const unsigned int bitstream_size =
AV_RL32(
buf);
776 unsigned int prestream_size;
779 if (bitstream_size > (1 << 26))
782 if (
length < bitstream_size + 12) {
787 prestream_size = 4 *
AV_RL32(
buf + bitstream_size + 4);
788 prestream =
buf + bitstream_size + 12;
790 if (prestream_size + bitstream_size + 12 !=
length
791 || prestream_size > (1 << 26)) {
793 prestream_size, bitstream_size,
length);
807 prestream_size =
length +
buf - prestream;
811 if (!
f->bitstream_buffer)
813 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
817 f->last_dc = 0 * 128 * 8 * 8;
819 for (y = 0; y <
height; y += 16) {
820 for (x = 0; x <
width; x += 16) {
838 int buf_size = avpkt->
size;
856 if (frame_4cc ==
AV_RL32(
"cfrm")) {
859 const int data_size = buf_size - 20;
862 if (
f->version <= 1) {
870 if (data_size < 0 || whole_size < 0) {
881 if (
f->cfrm[
i].id ==
id)
883 if (
f->cfrm[
i].size == 0)
904 memcpy(cfrm->
data + cfrm->
size,
buf + 20, data_size);
905 cfrm->
size += data_size;
907 if (cfrm->
size >= whole_size) {
918 cfrm->
size = cfrm->
id = 0;
930 if (frame_4cc ==
AV_RL32(
"ifr2")) {
936 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
942 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
948 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {
961 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
978 f->bitstream_buffer_size = 0;
981 f->cfrm[
i].allocated_size = 0;
1008 if (!
f->frame_buffer || !
f->last_frame_buffer) {