45 #define BLOCK_TYPE_VLC_BITS 5 
   46 #define ACDC_VLC_BITS 9 
   48 #define CFRAME_BUFFER_COUNT 100 
   53             { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
 
   55             { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
 
   57             { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
 
   59             { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
 
   63             { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
 
   65             { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
 
   67             { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
 
   69             { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
 
   81 static const int8_t 
mv[256][2] = {
 
   82     {   0,   0 }, {   0,  -1 }, {  -1,   0 }, {   1,   0 }, {   0,   1 }, {  -1,  -1 }, {   1,  -1 }, {  -1,   1 },
 
   83     {   1,   1 }, {   0,  -2 }, {  -2,   0 }, {   2,   0 }, {   0,   2 }, {  -1,  -2 }, {   1,  -2 }, {  -2,  -1 },
 
   84     {   2,  -1 }, {  -2,   1 }, {   2,   1 }, {  -1,   2 }, {   1,   2 }, {  -2,  -2 }, {   2,  -2 }, {  -2,   2 },
 
   85     {   2,   2 }, {   0,  -3 }, {  -3,   0 }, {   3,   0 }, {   0,   3 }, {  -1,  -3 }, {   1,  -3 }, {  -3,  -1 },
 
   86     {   3,  -1 }, {  -3,   1 }, {   3,   1 }, {  -1,   3 }, {   1,   3 }, {  -2,  -3 }, {   2,  -3 }, {  -3,  -2 },
 
   87     {   3,  -2 }, {  -3,   2 }, {   3,   2 }, {  -2,   3 }, {   2,   3 }, {   0,  -4 }, {  -4,   0 }, {   4,   0 },
 
   88     {   0,   4 }, {  -1,  -4 }, {   1,  -4 }, {  -4,  -1 }, {   4,  -1 }, {   4,   1 }, {  -1,   4 }, {   1,   4 },
 
   89     {  -3,  -3 }, {  -3,   3 }, {   3,   3 }, {  -2,  -4 }, {  -4,  -2 }, {   4,  -2 }, {  -4,   2 }, {  -2,   4 },
 
   90     {   2,   4 }, {  -3,  -4 }, {   3,  -4 }, {   4,  -3 }, {  -5,   0 }, {  -4,   3 }, {  -3,   4 }, {   3,   4 },
 
   91     {  -1,  -5 }, {  -5,  -1 }, {  -5,   1 }, {  -1,   5 }, {  -2,  -5 }, {   2,  -5 }, {   5,  -2 }, {   5,   2 },
 
   92     {  -4,  -4 }, {  -4,   4 }, {  -3,  -5 }, {  -5,  -3 }, {  -5,   3 }, {   3,   5 }, {  -6,   0 }, {   0,   6 },
 
   93     {  -6,  -1 }, {  -6,   1 }, {   1,   6 }, {   2,  -6 }, {  -6,   2 }, {   2,   6 }, {  -5,  -4 }, {   5,   4 },
 
   94     {   4,   5 }, {  -6,  -3 }, {   6,   3 }, {  -7,   0 }, {  -1,  -7 }, {   5,  -5 }, {  -7,   1 }, {  -1,   7 },
 
   95     {   4,  -6 }, {   6,   4 }, {  -2,  -7 }, {  -7,   2 }, {  -3,  -7 }, {   7,  -3 }, {   3,   7 }, {   6,  -5 },
 
   96     {   0,  -8 }, {  -1,  -8 }, {  -7,  -4 }, {  -8,   1 }, {   4,   7 }, {   2,  -8 }, {  -2,   8 }, {   6,   6 },
 
   97     {  -8,   3 }, {   5,  -7 }, {  -5,   7 }, {   8,  -4 }, {   0,  -9 }, {  -9,  -1 }, {   1,   9 }, {   7,  -6 },
 
   98     {  -7,   6 }, {  -5,  -8 }, {  -5,   8 }, {  -9,   3 }, {   9,  -4 }, {   7,  -7 }, {   8,  -6 }, {   6,   8 },
 
   99     {  10,   1 }, { -10,   2 }, {   9,  -5 }, {  10,  -3 }, {  -8,  -7 }, { -10,  -4 }, {   6,  -9 }, { -11,   0 },
 
  100     {  11,   1 }, { -11,  -2 }, {  -2,  11 }, {   7,  -9 }, {  -7,   9 }, {  10,   6 }, {  -4,  11 }, {   8,  -9 },
 
  101     {   8,   9 }, {   5,  11 }, {   7, -10 }, {  12,  -3 }, {  11,   6 }, {  -9,  -9 }, {   8,  10 }, {   5,  12 },
 
  102     { -11,   7 }, {  13,   2 }, {   6, -12 }, {  10,   9 }, { -11,   8 }, {  -7,  12 }, {   0,  14 }, {  14,  -2 },
 
  103     {  -9,  11 }, {  -6,  13 }, { -14,  -4 }, {  -5, -14 }, {   5,  14 }, { -15,  -1 }, { -14,  -6 }, {   3, -15 },
 
  104     {  11, -11 }, {  -7,  14 }, {  -5,  15 }, {   8, -14 }, {  15,   6 }, {   3,  16 }, {   7, -15 }, { -16,   5 },
 
  105     {   0,  17 }, { -16,  -6 }, { -10,  14 }, { -16,   7 }, {  12,  13 }, { -16,   8 }, { -17,   6 }, { -18,   3 },
 
  106     {  -7,  17 }, {  15,  11 }, {  16,  10 }, {   2, -19 }, {   3, -19 }, { -11, -16 }, { -18,   8 }, { -19,  -6 },
 
  107     {   2, -20 }, { -17, -11 }, { -10, -18 }, {   8,  19 }, { -21,  -1 }, { -20,   7 }, {  -4,  21 }, {  21,   5 },
 
  108     {  15,  16 }, {   2, -22 }, { -10, -20 }, { -22,   5 }, {  20, -11 }, {  -7, -22 }, { -12,  20 }, {  23,  -5 },
 
  109     {  13, -20 }, {  24,  -2 }, { -15,  19 }, { -11,  22 }, {  16,  19 }, {  23, -10 }, { -18, -18 }, {  -9, -24 },
 
  110     {  24, -10 }, {  -3,  26 }, { -23,  13 }, { -18, -20 }, {  17,  21 }, {  -4,  27 }, {  27,   6 }, {   1, -28 },
 
  111     { -11,  26 }, { -17, -23 }, {   7,  28 }, {  11, -27 }, {  29,   5 }, { -23, -19 }, { -28, -11 }, { -21,  22 },
 
  112     { -30,   7 }, { -17,  26 }, { -27,  16 }, {  13,  29 }, {  19, -26 }, {  10, -31 }, { -14, -30 }, {  20, -27 },
 
  113     { -29,  18 }, { -16, -31 }, { -28, -22 }, {  21, -30 }, { -25,  28 }, {  26, -29 }, {  25, -32 }, { -32, -32 }
 
  119     16, 15, 13, 19, 24, 31, 28, 17,
 
  120     17, 23, 25, 31, 36, 63, 45, 21,
 
  121     18, 24, 27, 37, 52, 59, 49, 20,
 
  122     16, 28, 34, 40, 60, 80, 51, 20,
 
  123     18, 31, 48, 66, 68, 86, 56, 21,
 
  124     19, 38, 56, 59, 64, 64, 48, 20,
 
  125     27, 48, 55, 55, 56, 51, 35, 15,
 
  126     20, 35, 34, 32, 31, 22, 15,  8,
 
  160 #define FIX_1_082392200  70936 
  161 #define FIX_1_414213562  92682 
  162 #define FIX_1_847759065 121095 
  163 #define FIX_2_613125930 171254 
  165 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16) 
  169     int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
 
  170     int tmp10, tmp11, tmp12, tmp13;
 
  171     int z5, z10, z11, z12, z13;
 
  175     for (
i = 0; 
i < 8; 
i++) {
 
  182         tmp0 = tmp10 + tmp13;
 
  183         tmp3 = tmp10 - tmp13;
 
  184         tmp1 = tmp11 + tmp12;
 
  185         tmp2 = tmp11 - tmp12;
 
  203         temp[8 * 0 + 
i] = tmp0 + tmp7;
 
  204         temp[8 * 7 + 
i] = tmp0 - tmp7;
 
  205         temp[8 * 1 + 
i] = tmp1 + tmp6;
 
  206         temp[8 * 6 + 
i] = tmp1 - tmp6;
 
  207         temp[8 * 2 + 
i] = tmp2 + tmp5;
 
  208         temp[8 * 5 + 
i] = tmp2 - tmp5;
 
  209         temp[8 * 4 + 
i] = tmp3 + tmp4;
 
  210         temp[8 * 3 + 
i] = tmp3 - tmp4;
 
  213     for (
i = 0; 
i < 8 * 8; 
i += 8) {
 
  220         tmp0 = tmp10 + tmp13;
 
  221         tmp3 = tmp10 - tmp13;
 
  222         tmp1 = tmp11 + tmp12;
 
  223         tmp2 = tmp11 - tmp12;
 
  241         block[0 + 
i] = (tmp0 + tmp7) >> 6;
 
  242         block[7 + 
i] = (tmp0 - tmp7) >> 6;
 
  243         block[1 + 
i] = (tmp1 + tmp6) >> 6;
 
  244         block[6 + 
i] = (tmp1 - tmp6) >> 6;
 
  245         block[2 + 
i] = (tmp2 + tmp5) >> 6;
 
  246         block[5 + 
i] = (tmp2 - tmp5) >> 6;
 
  247         block[4 + 
i] = (tmp3 + tmp4) >> 6;
 
  248         block[3 + 
i] = (tmp3 - tmp4) >> 6;
 
  256     for (
i = 0; 
i < 2; 
i++) {
 
  257         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++) {
 
  340         av_unreachable(
"log2w starts at 3 and gets only decremented during " 
  341                        "recursive calls to decode_p_block");
 
  346                           int log2w, 
int log2h, 
int stride)
 
  349     uint16_t *start, *end;
 
  364     start = 
f->last_frame_buffer;
 
  365     end   = start + 
stride * (
f->avctx->height - 
h + 1) - (1 << log2w);
 
  374     } 
else if (
code == 2) {
 
  381     } 
else if (
code == 6) {
 
  387             dst[0]      = bytestream2_get_le16u(&
f->g2);
 
  388             dst[1]      = bytestream2_get_le16u(&
f->g2);
 
  390             dst[0]      = bytestream2_get_le16u(&
f->g2);
 
  402         src  += 
f->mv[bytestream2_get_byte(&
f->g)];
 
  403     } 
else if (
code == 3 && 
f->version >= 2) {
 
  405     } 
else if (
code == 4) {
 
  406         src  += 
f->mv[bytestream2_get_byte(&
f->g)];
 
  411         dc    = bytestream2_get_le16(&
f->g2);
 
  412     } 
else if (
code == 5) {
 
  419         dc    = bytestream2_get_le16(&
f->g2);
 
  422     if (start > 
src || 
src > end) {
 
  435     const int width  = 
f->avctx->width;
 
  436     const int height = 
f->avctx->height;
 
  437     uint16_t *
dst    = 
f->frame_buffer;
 
  439     unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
 
  440                  bytestream_offset, wordstream_offset;
 
  443     src = 
f->last_frame_buffer;
 
  445     if (
f->version > 1) {
 
  449         bitstream_size  = 
AV_RL32(buf + 8);
 
  450         wordstream_size = 
AV_RL32(buf + 12);
 
  451         bytestream_size = 
AV_RL32(buf + 16);
 
  454         bitstream_size  = 
AV_RL16(buf - 4);
 
  455         wordstream_size = 
AV_RL16(buf - 2);
 
  456         bytestream_size = 
FFMAX(length - bitstream_size - wordstream_size, 0);
 
  459     if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
 
  460         bytestream_size > length - bitstream_size ||
 
  461         wordstream_size > length - bytestream_size - bitstream_size ||
 
  462         extra > length - bytestream_size - bitstream_size - wordstream_size) {
 
  463         av_log(
f->avctx, 
AV_LOG_ERROR, 
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
 
  464         bitstream_size+ bytestream_size+ wordstream_size - length);
 
  470     if (!
f->bitstream_buffer)
 
  472     f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (buf + extra),
 
  476     wordstream_offset = extra + bitstream_size;
 
  477     bytestream_offset = extra + bitstream_size + wordstream_size;
 
  479                      length - wordstream_offset);
 
  481                      length - bytestream_offset);
 
  485     for (y = 0; y < 
height; y += 8) {
 
  486         for (x = 0; x < 
width; x += 8)
 
  561     int16_t (*
block)[64] = 
f->block;
 
  564     uint16_t *
dst = 
f->frame_buffer + y * 
stride + x;
 
  566     for (
i = 0; 
i < 4; 
i++) {
 
  567         block[
i][0] += 0x80 * 8 * 8;
 
  572         for (
i = 4; 
i < 6; 
i++)
 
  580     for (y = 0; y < 8; y++) {
 
  581         for (x = 0; x < 8; x++) {
 
  582             int16_t *
temp = 
block[(x >> 2) + 2 * (y >> 2)] +
 
  583                             2 * (x & 3) + 2 * 8 * (y & 3); 
 
  586             int cg = (
cb + 
cr) >> 1;
 
  592             dst[0]          = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + 
cr) & 0xF8) << 8);
 
  594             dst[1]          = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + 
cr) & 0xF8) << 8);
 
  596             dst[
stride]     = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + 
cr) & 0xF8) << 8);
 
  598             dst[1 + 
stride] = ((y + 
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + 
cr) & 0xF8) << 8);
 
  610     f->bdsp.clear_blocks(
f->block[0]);
 
  612     for (
i = 0; 
i < 6; 
i++)
 
  620                                           const uint8_t * 
const buf,
 
  623     int frequency[512] = { 0 };
 
  626     uint8_t len_tab[257];
 
  629     const uint8_t *ptr = buf;
 
  630     const uint8_t *ptr_end = buf + buf_size;
 
  633     memset(up, -1, 
sizeof(up));
 
  640         if (ptr_end - ptr < 
FFMAX(end - start + 1, 0) + 1) {
 
  645         for (
i = start; 
i <= end; 
i++)
 
  646             frequency[
i] = *ptr++;
 
  655     while ((ptr - buf) & 3)
 
  663     for (j = 257; j < 512; j++) {
 
  664         int min_freq[2] = { 256 * 256, 256 * 256 };
 
  665         int smallest[2] = { 0, 0 };
 
  667         for (
i = 0; 
i < j; 
i++) {
 
  668             if (frequency[
i] == 0)
 
  670             if (frequency[
i] < min_freq[1]) {
 
  671                 if (frequency[
i] < min_freq[0]) {
 
  672                     min_freq[1] = min_freq[0];
 
  673                     smallest[1] = smallest[0];
 
  674                     min_freq[0] = frequency[
i];
 
  677                     min_freq[1] = frequency[
i];
 
  682         if (min_freq[1] == 256 * 256)
 
  685         frequency[j]           = min_freq[0] + min_freq[1];
 
  686         flag[smallest[0]]      = 0;
 
  687         flag[smallest[1]]      = 1;
 
  690         frequency[smallest[0]] = frequency[smallest[1]] = 0;
 
  693     for (j = 0; j < 257; j++) {
 
  696         for (node = j; up[node] != -1; node = up[node]) {
 
  702                        "vlc length overflow\n");
 
  719     int blue  =  2 * (c0 & 0x001F) + (
c1 & 0x001F);
 
  720     int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
 
  721     int red   =  2 * (c0 >> 10)    + (
c1 >> 10);
 
  722     return red / 3 * 1024 + green / 3 * 32 + blue / 3;
 
  728     const int width  = 
f->avctx->width;
 
  729     const int height = 
f->avctx->height;
 
  731     uint16_t *
dst    = 
f->frame_buffer;
 
  732     const uint8_t *buf_end = buf + length;
 
  735     if (length < mbs * 8) {
 
  741     for (y = 0; y < 
height; y += 16) {
 
  742         for (x = 0; x < 
width; x += 16) {
 
  744             if (buf_end - buf < 8)
 
  747             color[0] = bytestream2_get_le16u(&g3);
 
  748             color[1] = bytestream2_get_le16u(&g3);
 
  750             if (
color[0] & 0x8000)
 
  752             if (
color[1] & 0x8000)
 
  758             bits = bytestream2_get_le32u(&g3);
 
  759             for (y2 = 0; y2 < 16; y2++) {
 
  760                 for (x2 = 0; x2 < 16; x2++) {
 
  761                     int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
 
  776     const int width  = 
f->avctx->width;
 
  777     const int height = 
f->avctx->height;
 
  778     const unsigned int bitstream_size = 
AV_RL32(buf);
 
  779     unsigned int prestream_size;
 
  780     const uint8_t *prestream;
 
  782     if (bitstream_size > (1 << 26))
 
  785     if (length < bitstream_size + 12) {
 
  790     prestream_size = 4 * 
AV_RL32(buf + bitstream_size + 4);
 
  791     prestream      =             buf + bitstream_size + 12;
 
  793     if (prestream_size + bitstream_size + 12 != length
 
  794         || prestream_size > (1 << 26)) {
 
  796                prestream_size, bitstream_size, length);
 
  810     prestream_size = length + buf - prestream;
 
  814     if (!
f->bitstream_buffer)
 
  816     f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
 
  820     f->last_dc = 0 * 128 * 8 * 8;
 
  822     for (y = 0; y < 
height; y += 16) {
 
  823         for (x = 0; x < 
width; x += 16) {
 
  840     const uint8_t *buf    = avpkt->
data;
 
  841     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)
 
  908         memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
 
  909         cfrm->
size += data_size;
 
  911         if (cfrm->
size >= whole_size) {
 
  922             cfrm->
size = cfrm->
id = 0;
 
  932         || frame_4cc == 
AV_RL32(
"pfrm") || frame_4cc == 
AV_RL32(
"pfr2")) {
 
  937     if (frame_4cc == 
AV_RL32(
"ifr2")) {
 
  943     } 
else if (frame_4cc == 
AV_RL32(
"ifrm")) {
 
  949     } 
else if (frame_4cc == 
AV_RL32(
"pfrm") || frame_4cc == 
AV_RL32(
"pfr2")) {
 
  955     } 
else if (frame_4cc == 
AV_RL32(
"snd_")) {
 
  971                         (
const uint8_t*)
f->frame_buffer,  avctx->
width * 2,
 
  973     FFSWAP(uint16_t *, 
f->frame_buffer, 
f->last_frame_buffer);
 
  988     f->bitstream_buffer_size = 0;
 
  991         f->cfrm[
i].allocated_size = 0;
 
 1019     if (!
f->frame_buffer || !
f->last_frame_buffer)