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) (((var) * (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++) {
 
  172         tmp10 = block[8 * 0 + i] + block[8 * 4 + i];
 
  173         tmp11 = block[8 * 0 + i] - block[8 * 4 + i];
 
  175         tmp13 = block[8 * 2 + i] + block[8 * 6 + i];
 
  178         tmp0 = tmp10 + tmp13;
 
  179         tmp3 = tmp10 - tmp13;
 
  180         tmp1 = tmp11 + tmp12;
 
  181         tmp2 = tmp11 - tmp12;
 
  183         z13 = block[8 * 5 + i] + block[8 * 3 + i];
 
  184         z10 = block[8 * 5 + i] - block[8 * 3 + i];
 
  185         z11 = block[8 * 1 + i] + block[8 * 7 + i];
 
  186         z12 = block[8 * 1 + i] - block[8 * 7 + i];
 
  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) {
 
  210         tmp10 = temp[0 + i] + temp[4 + i];
 
  211         tmp11 = temp[0 + i] - temp[4 + i];
 
  213         tmp13 = temp[2 + i] + temp[6 + i];
 
  216         tmp0 = tmp10 + tmp13;
 
  217         tmp3 = tmp10 - tmp13;
 
  218         tmp1 = tmp11 + tmp12;
 
  219         tmp2 = tmp11 - tmp12;
 
  221         z13 = temp[5 + i] + temp[3 + i];
 
  222         z10 = temp[5 + i] - temp[3 + i];
 
  223         z11 = temp[1 + i] + temp[7 + i];
 
  224         z12 = temp[1 + i] - temp[7 + i];
 
  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++) {
 
  255             block_type_vlc[i][j].
table           = table[i][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)
 
  360     end   = start + stride * (f->
avctx->
height - h + 1) - (1 << log2w);
 
  364         if ((ret = 
decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
 
  367                               src + (stride << log2h),
 
  368                               log2w, log2h, stride);
 
  369     } 
else if (code == 2) {
 
  371         if ((ret = 
decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
 
  375                               log2w, log2h, stride);
 
  376     } 
else if (code == 6) {
 
  382             dst[0]      = bytestream2_get_le16u(&f->
g2);
 
  383             dst[1]      = bytestream2_get_le16u(&f->
g2);
 
  385             dst[0]      = bytestream2_get_le16u(&f->
g2);
 
  386             dst[stride] = bytestream2_get_le16u(&f->
g2);
 
  397         src  += f->
mv[bytestream2_get_byte(&f->
g)];
 
  398     } 
else if (code == 3 && f->
version >= 2) {
 
  400     } 
else if (code == 4) {
 
  401         src  += f->
mv[bytestream2_get_byte(&f->
g)];
 
  406         dc    = bytestream2_get_le16(&f->
g2);
 
  407     } 
else if (code == 5) {
 
  414         dc    = bytestream2_get_le16(&f->
g2);
 
  417     if (start > src || src > end) {
 
  422     mcdc(dst, src, log2w, h, stride, scale, dc);
 
  434     unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
 
  435                  bytestream_offset, wordstream_offset;
 
  444         bitstream_size  = 
AV_RL32(buf + 8);
 
  445         wordstream_size = 
AV_RL32(buf + 12);
 
  446         bytestream_size = 
AV_RL32(buf + 16);
 
  449         bitstream_size  = 
AV_RL16(buf - 4);
 
  450         wordstream_size = 
AV_RL16(buf - 2);
 
  451         bytestream_size = 
FFMAX(length - bitstream_size - wordstream_size, 0);
 
  454     if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
 
  455         bytestream_size > length - bitstream_size ||
 
  456         wordstream_size > length - bytestream_size - bitstream_size ||
 
  457         extra > length - bytestream_size - bitstream_size - wordstream_size) {
 
  459         bitstream_size+ bytestream_size+ wordstream_size - length);
 
  471     wordstream_offset = extra + bitstream_size;
 
  472     bytestream_offset = extra + bitstream_size + wordstream_size;
 
  474                      length - wordstream_offset);
 
  476                      length - bytestream_offset);
 
  480     for (y = 0; y < 
height; y += 8) {
 
  481         for (x = 0; x < 
width; x += 8)
 
  557     for (i = 0; i < 4; i++) {
 
  558         block[i][0] += 0x80 * 8 * 8;
 
  563         for (i = 4; i < 6; i++)
 
  571     for (y = 0; y < 8; y++) {
 
  572         for (x = 0; x < 8; x++) {
 
  573             int16_t *
temp = 
block[(x >> 2) + 2 * (y >> 2)] +
 
  574                             2 * (x & 3) + 2 * 8 * (y & 3); 
 
  577             int cg = (cb + 
cr) >> 1;
 
  583             dst[0]          = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
 
  585             dst[1]          = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
 
  587             dst[stride]     = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
 
  589             dst[1 + stride] = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
 
  592         dst += 2 * stride - 2 * 8;
 
  603     for (i = 0; i < 6; i++)
 
  614     int frequency[512] = { 0 };
 
  621     const uint8_t *ptr_end = buf + buf_size;
 
  624     memset(up, -1, 
sizeof(up));
 
  631         if (ptr_end - ptr < 
FFMAX(end - start + 1, 0) + 1) {
 
  636         for (i = start; i <= 
end; i++)
 
  637             frequency[i] = *ptr++;
 
  646     while ((ptr - buf) & 3)
 
  654     for (j = 257; j < 512; j++) {
 
  655         int min_freq[2] = { 256 * 256, 256 * 256 };
 
  656         int smallest[2] = { 0, 0 };
 
  658         for (i = 0; i < j; i++) {
 
  659             if (frequency[i] == 0)
 
  661             if (frequency[i] < min_freq[1]) {
 
  662                 if (frequency[i] < min_freq[0]) {
 
  663                     min_freq[1] = min_freq[0];
 
  664                     smallest[1] = smallest[0];
 
  665                     min_freq[0] = frequency[i];
 
  668                     min_freq[1] = frequency[i];
 
  673         if (min_freq[1] == 256 * 256)
 
  676         frequency[j]           = min_freq[0] + min_freq[1];
 
  677         flag[smallest[0]]      = 0;
 
  678         flag[smallest[1]]      = 1;
 
  681         frequency[smallest[0]] = frequency[smallest[1]] = 0;
 
  684     for (j = 0; j < 257; j++) {
 
  687         for (node = j; up[node] != -1; node = up[node]) {
 
  693                        "vlc length overflow\n");
 
  709     int blue  =  2 * (c0 & 0x001F) + (c1 & 0x001F);
 
  710     int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
 
  711     int red   =  2 * (c0 >> 10)    + (c1 >> 10);
 
  712     return red / 3 * 1024 + green / 3 * 32 + blue / 3;
 
  720     const int mbs    = (
FFALIGN(width, 16) >> 4) * (
FFALIGN(height, 16) >> 4);
 
  725     if (length < mbs * 8) {
 
  731     for (y = 0; y < 
height; y += 16) {
 
  732         for (x = 0; x < 
width; x += 16) {
 
  734             if (buf_end - buf < 8)
 
  737             color[0] = bytestream2_get_le16u(&g3);
 
  738             color[1] = bytestream2_get_le16u(&g3);
 
  740             if (color[0] & 0x8000)
 
  742             if (color[1] & 0x8000)
 
  745             color[2] = 
mix(color[0], color[1]);
 
  746             color[3] = 
mix(color[1], color[0]);
 
  748             bits = bytestream2_get_le32u(&g3);
 
  749             for (y2 = 0; y2 < 16; y2++) {
 
  750                 for (x2 = 0; x2 < 16; x2++) {
 
  751                     int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
 
  752                     dst[y2 * width + x2] = color[(
bits >> 
index) & 3];
 
  757         dst += 16 * width - x;
 
  768     const unsigned int bitstream_size = 
AV_RL32(buf);
 
  769     unsigned int prestream_size;
 
  772     if (bitstream_size > (1 << 26))
 
  775     if (length < bitstream_size + 12) {
 
  780     prestream_size = 4 * 
AV_RL32(buf + bitstream_size + 4);
 
  781     prestream      =             buf + bitstream_size + 12;
 
  783     if (prestream_size + bitstream_size + 12 != length
 
  784         || prestream_size > (1 << 26)) {
 
  786                prestream_size, bitstream_size, length);
 
  800     prestream_size = length + buf - prestream;
 
  812     for (y = 0; y < 
height; y += 16) {
 
  813         for (x = 0; x < 
width; x += 16) {
 
  831     int buf_size          = avpkt->
size;
 
  841     if (buf_size < 
AV_RL32(buf + 4) + 8) {
 
  849     if (frame_4cc == 
AV_RL32(
"cfrm")) {
 
  852         const int data_size  = buf_size - 20;
 
  861         whole_size = 
AV_RL32(buf + 16);
 
  863         if (data_size < 0 || whole_size < 0) {
 
  880         if (i >= CFRAME_BUFFER_COUNT) {
 
  897         memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
 
  898         cfrm->
size += data_size;
 
  900         if (cfrm->
size >= whole_size) {
 
  902             frame_size = cfrm->
size;
 
  911             cfrm->
size = cfrm->
id = 0;
 
  917         frame_size = buf_size - 12;
 
  923     if (frame_4cc == 
AV_RL32(
"ifr2")) {
 
  929     } 
else if (frame_4cc == 
AV_RL32(
"ifrm")) {
 
  935     } 
else if (frame_4cc == 
AV_RL32(
"pfrm") || frame_4cc == 
AV_RL32(
"pfr2")) {
 
  941     } 
else if (frame_4cc == 
AV_RL32(
"snd_")) {