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) {