39 #define BITSTREAM_READER_LE 
   43 #define RUNTIME_GAMMA 0 
   45 #define VGA__TAG MKTAG('V', 'G', 'A', ' ') 
   46 #define PALT_TAG MKTAG('P', 'A', 'L', 'T') 
   47 #define SHOT_TAG MKTAG('S', 'H', 'O', 'T') 
   48 #define PALETTE_COUNT 256 
   49 #define PALETTE_SIZE (PALETTE_COUNT * 3) 
   50 #define PALETTES_MAX 256 
   58     const unsigned char *
buf;
 
  101                               const unsigned char *src, 
int src_len)
 
  103     unsigned char byte = *src++;
 
  104     unsigned char ival = byte + 0x16;
 
  105     const unsigned char * ptr = src + byte*2;
 
  106     int ptr_len = src_len - 1 - byte*2;
 
  107     unsigned char val = ival;
 
  108     unsigned char *dest_end = dest + dest_len;
 
  116     while (val != 0x16) {
 
  123             if (dest >= dest_end)
 
  139                        const unsigned char *src, 
int src_len)
 
  141     unsigned char opcode;
 
  143     unsigned char *dest_org = dest;
 
  144     unsigned char *dest_end = dest + dest_len;
 
  149         opcode = bytestream2_get_byte(&ctx);
 
  153             if ((opcode & 0x80) == 0) {
 
  156                 back  = ((opcode & 0x60) << 3) + bytestream2_get_byte(&ctx) + 1;
 
  157                 size2 = ((opcode & 0x1c) >> 2) + 3;
 
  158             } 
else if ((opcode & 0x40) == 0) {
 
  159                 size = bytestream2_peek_byte(&ctx) >> 6;
 
  161                 back  = (bytestream2_get_be16(&ctx) & 0x3fff) + 1;
 
  162                 size2 = (opcode & 0x3f) + 4;
 
  166                 back  = ((opcode & 0x10) << 12) + bytestream2_get_be16(&ctx) + 1;
 
  167                 size2 = ((opcode & 0x0c) <<  6) + bytestream2_get_byte(&ctx) + 5;
 
  170             if (dest_end - dest < size + size2 ||
 
  171                 dest + size - dest_org < back ||
 
  179             int finish = opcode >= 0xfc;
 
  180             size = finish ? opcode & 3 : ((opcode & 0x1f) << 2) + 4;
 
  193     const unsigned char *pixel_buffer, 
int x, 
int y, 
int pixel_count)
 
  200     unsigned char *palette_plane;
 
  204     line_inc = stride - 
width;
 
  205     index = y * stride + x;
 
  207     while (pixel_count && index < s->
frame_size) {
 
  208         int count = 
FFMIN(pixel_count, width - current_x);
 
  209         memcpy(palette_plane + index, pixel_buffer, count);
 
  210         pixel_count  -= count;
 
  212         pixel_buffer += count;
 
  215         if (current_x >= width) {
 
  223                                           int pixel_count, 
int motion_x,
 
  228     int curframe_index, prevframe_index;
 
  229     int curframe_x, prevframe_x;
 
  231     unsigned char *palette_plane, *prev_palette_plane;
 
  233     if (y + motion_y < 0 || y + motion_y >= s->
avctx->
height ||
 
  234         x + motion_x < 0 || x + motion_x >= s->
avctx->
width)
 
  239     if (!prev_palette_plane)
 
  240         prev_palette_plane = palette_plane;
 
  242     line_inc = stride - 
width;
 
  243     curframe_index = y * stride + x;
 
  245     prevframe_index = (y + motion_y) * stride + x + motion_x;
 
  246     prevframe_x = x + motion_x;
 
  247     while (pixel_count &&
 
  250         int count = 
FFMIN3(pixel_count, width - curframe_x,
 
  251                            width - prevframe_x);
 
  253         memcpy(palette_plane + curframe_index,
 
  254                prev_palette_plane + prevframe_index, count);
 
  255         pixel_count     -= count;
 
  256         curframe_index  += count;
 
  257         prevframe_index += count;
 
  259         prevframe_x     += count;
 
  261         if (curframe_x >= width) {
 
  262             curframe_index += line_inc;
 
  266         if (prevframe_x >= width) {
 
  267             prevframe_index += line_inc;
 
  277     int total_pixels = width * 
height;
 
  278     unsigned char opcode;
 
  279     unsigned char flag = 0;
 
  281     int motion_x, motion_y;
 
  284     unsigned char *opcode_buffer = s->
buffer1;
 
  287     const unsigned char *imagedata_buffer = s->
buffer2;
 
  290     const unsigned char *huffman_segment;
 
  291     const unsigned char *size_segment;
 
  292     const unsigned char *vector_segment;
 
  293     const unsigned char *imagedata_segment;
 
  294     const unsigned char *buf_end = s->
buf + s->
size;
 
  295     int huffman_offset, size_offset, vector_offset, imagedata_offset,
 
  306     if (huffman_offset   >= s->
size ||
 
  307         size_offset      >= s->
size ||
 
  308         vector_offset    >= s->
size ||
 
  309         imagedata_offset >= s->
size)
 
  312     huffman_segment   = s->
buf + huffman_offset;
 
  313     size_segment      = s->
buf + size_offset;
 
  314     vector_segment    = s->
buf + vector_offset;
 
  315     imagedata_segment = s->
buf + imagedata_offset;
 
  318                            huffman_segment, s->
size - huffman_offset) < 0)
 
  321     if (imagedata_segment[0] == 2) {
 
  323                    &imagedata_segment[1], s->
size - imagedata_offset - 1);
 
  326         imagedata_size = s->
size - imagedata_offset - 1;
 
  327         imagedata_buffer = &imagedata_segment[1];
 
  332     while (total_pixels && opcode_buffer < opcode_buffer_end) {
 
  334         opcode = *opcode_buffer++;
 
  361             size += (opcode - 10);
 
  366             if (buf_end - size_segment < 1) {
 
  370             size = *size_segment++;
 
  375             if (buf_end - size_segment < 2) {
 
  379             size = 
AV_RB16(&size_segment[0]);
 
  385             if (buf_end - size_segment < 3) {
 
  394         if (size > total_pixels)
 
  404                 if (imagedata_size < size)
 
  407                 imagedata_buffer += 
size;
 
  408                 imagedata_size -= 
size;
 
  411             if (vector_segment >= buf_end) {
 
  427         total_pixels -= 
size;
 
  428         y += (x + 
size) / width;
 
  429         x  = (x + 
size) % width;
 
  435 static inline unsigned mul(
unsigned a, 
unsigned b)
 
  437     return (a * b) >> 16;
 
  440 static inline unsigned pow4(
unsigned a)
 
  442     unsigned square = mul(a, a);
 
  443     return mul(square, square);
 
  446 static inline unsigned pow5(
unsigned a)
 
  448     return mul(pow4(a), a);
 
  452     unsigned lo, hi = 0xff40, target;
 
  454     in = (in << 2) | (in >> 6);
 
  460     lo = target = in << 8;
 
  462         unsigned mid = (lo + hi) >> 1;
 
  463         unsigned pow = pow5(mid);
 
  464         if (pow > target) hi = mid;
 
  467     return (pow4((lo + hi) >> 1) + 0x80) >> 8;
 
  482     0x00, 0x09, 0x10, 0x16, 0x1C, 0x21, 0x27, 0x2C,
 
  483     0x31, 0x35, 0x3A, 0x3F, 0x43, 0x48, 0x4C, 0x50,
 
  484     0x54, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71,
 
  485     0x75, 0x79, 0x7D, 0x80, 0x84, 0x88, 0x8C, 0x8F,
 
  486     0x93, 0x97, 0x9A, 0x9E, 0xA2, 0xA5, 0xA9, 0xAC,
 
  487     0xB0, 0xB3, 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8,
 
  488     0xCB, 0xCF, 0xD2, 0xD5, 0xD9, 0xDC, 0xDF, 0xE3,
 
  489     0xE6, 0xE9, 0xED, 0xF0, 0xF3, 0xF6, 0xFA, 0xFD,
 
  490     0x03, 0x0B, 0x12, 0x18, 0x1D, 0x23, 0x28, 0x2D,
 
  491     0x32, 0x36, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x51,
 
  492     0x56, 0x5A, 0x5E, 0x62, 0x66, 0x6A, 0x6E, 0x72,
 
  493     0x76, 0x7A, 0x7D, 0x81, 0x85, 0x89, 0x8D, 0x90,
 
  494     0x94, 0x98, 0x9B, 0x9F, 0xA2, 0xA6, 0xAA, 0xAD,
 
  495     0xB1, 0xB4, 0xB8, 0xBB, 0xBF, 0xC2, 0xC5, 0xC9,
 
  496     0xCC, 0xD0, 0xD3, 0xD6, 0xDA, 0xDD, 0xE0, 0xE4,
 
  497     0xE7, 0xEA, 0xED, 0xF1, 0xF4, 0xF7, 0xFA, 0xFD,
 
  498     0x05, 0x0D, 0x13, 0x19, 0x1F, 0x24, 0x29, 0x2E,
 
  499     0x33, 0x38, 0x3C, 0x41, 0x45, 0x4A, 0x4E, 0x52,
 
  500     0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x6F, 0x73,
 
  501     0x77, 0x7B, 0x7E, 0x82, 0x86, 0x8A, 0x8D, 0x91,
 
  502     0x95, 0x99, 0x9C, 0xA0, 0xA3, 0xA7, 0xAA, 0xAE,
 
  503     0xB2, 0xB5, 0xB9, 0xBC, 0xBF, 0xC3, 0xC6, 0xCA,
 
  504     0xCD, 0xD0, 0xD4, 0xD7, 0xDA, 0xDE, 0xE1, 0xE4,
 
  505     0xE8, 0xEB, 0xEE, 0xF1, 0xF5, 0xF8, 0xFB, 0xFD,
 
  506     0x07, 0x0E, 0x15, 0x1A, 0x20, 0x25, 0x2A, 0x2F,
 
  507     0x34, 0x39, 0x3D, 0x42, 0x46, 0x4B, 0x4F, 0x53,
 
  508     0x58, 0x5C, 0x60, 0x64, 0x68, 0x6C, 0x70, 0x74,
 
  509     0x78, 0x7C, 0x7F, 0x83, 0x87, 0x8B, 0x8E, 0x92,
 
  510     0x96, 0x99, 0x9D, 0xA1, 0xA4, 0xA8, 0xAB, 0xAF,
 
  511     0xB2, 0xB6, 0xB9, 0xBD, 0xC0, 0xC4, 0xC7, 0xCB,
 
  512     0xCE, 0xD1, 0xD5, 0xD8, 0xDB, 0xDF, 0xE2, 0xE5,
 
  513     0xE9, 0xEC, 0xEF, 0xF2, 0xF6, 0xF9, 0xFC, 0xFD
 
  518                             void *
data, 
int *got_frame,
 
  522     int ret, buf_size = avpkt->
size;
 
  533         tag  = bytestream2_get_le32(&ctx);
 
  534         size = bytestream2_get_be32(&ctx);
 
  554                 int r = gamma_corr(bytestream2_get_byteu(&ctx));
 
  555                 int g = gamma_corr(bytestream2_get_byteu(&ctx));
 
  556                 int b = gamma_corr(bytestream2_get_byteu(&ctx));
 
  558                 int r = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  559                 int g = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  560                 int b = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  562                 *tmpptr++ = (0xFF
U << 24) | (r << 16) | (g << 8) | b;
 
  569             new_pal = bytestream2_get_le32(&ctx);
 
  570             if (new_pal < s->palettes_count) {