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 
   57     const unsigned char *
buf;
 
  105                               const unsigned char *
src, 
int src_len)
 
  107     unsigned char byte = *src++;
 
  108     unsigned char ival = byte + 0x16;
 
  109     const unsigned char * ptr = src + byte*2;
 
  110     int ptr_len = src_len - 1 - byte*2;
 
  111     unsigned char val = ival;
 
  112     unsigned char *dest_end = dest + dest_len;
 
  120     while (val != 0x16) {
 
  127             if (dest >= dest_end)
 
  143                        const unsigned char *
src, 
int src_len)
 
  145     unsigned char opcode;
 
  147     unsigned char *dest_org = dest;
 
  148     unsigned char *dest_end = dest + dest_len;
 
  153         opcode = bytestream2_get_byte(&ctx);
 
  157             if ((opcode & 0x80) == 0) {
 
  160                 back  = ((opcode & 0x60) << 3) + bytestream2_get_byte(&ctx) + 1;
 
  161                 size2 = ((opcode & 0x1c) >> 2) + 3;
 
  162             } 
else if ((opcode & 0x40) == 0) {
 
  163                 size = bytestream2_peek_byte(&ctx) >> 6;
 
  165                 back  = (bytestream2_get_be16(&ctx) & 0x3fff) + 1;
 
  166                 size2 = (opcode & 0x3f) + 4;
 
  170                 back  = ((opcode & 0x10) << 12) + bytestream2_get_be16(&ctx) + 1;
 
  171                 size2 = ((opcode & 0x0c) <<  6) + bytestream2_get_byte(&ctx) + 5;
 
  174             if (dest_end - dest < size + size2 ||
 
  175                 dest + size - dest_org < back ||
 
  183             int finish = opcode >= 0xfc;
 
  184             size = finish ? opcode & 3 : ((opcode & 0x1f) << 2) + 4;
 
  197     const unsigned char *pixel_buffer, 
int x, 
int y, 
int pixel_count)
 
  204     unsigned char *palette_plane;
 
  206     palette_plane = frame->
data[0];
 
  208     line_inc = stride - 
width;
 
  209     index = y * stride + x;
 
  211     while (pixel_count && index < s->
frame_size) {
 
  212         int count = 
FFMIN(pixel_count, width - current_x);
 
  213         memcpy(palette_plane + index, pixel_buffer, count);
 
  214         pixel_count  -= 
count;
 
  216         pixel_buffer += 
count;
 
  219         if (current_x >= width) {
 
  228                                           int pixel_count, 
int motion_x,
 
  233     int curframe_index, prevframe_index;
 
  234     int curframe_x, prevframe_x;
 
  236     unsigned char *palette_plane, *prev_palette_plane;
 
  238     if (y + motion_y < 0 || y + motion_y >= s->
avctx->
height ||
 
  239         x + motion_x < 0 || x + motion_x >= s->
avctx->
width)
 
  242     palette_plane = frame->
data[0];
 
  244     if (!prev_palette_plane)
 
  245         prev_palette_plane = palette_plane;
 
  247     line_inc = stride - 
width;
 
  248     curframe_index = y * stride + x;
 
  250     prevframe_index = (y + motion_y) * stride + x + motion_x;
 
  251     prevframe_x = x + motion_x;
 
  253     if (prev_palette_plane == palette_plane && 
FFABS(curframe_index - prevframe_index) < pixel_count) {
 
  258     while (pixel_count &&
 
  261         int count = 
FFMIN3(pixel_count, width - curframe_x,
 
  262                            width - prevframe_x);
 
  264         memcpy(palette_plane + curframe_index,
 
  265                prev_palette_plane + prevframe_index, count);
 
  266         pixel_count     -= 
count;
 
  267         curframe_index  += 
count;
 
  268         prevframe_index += 
count;
 
  270         prevframe_x     += 
count;
 
  272         if (curframe_x >= width) {
 
  273             curframe_index += line_inc;
 
  277         if (prevframe_x >= width) {
 
  278             prevframe_index += line_inc;
 
  289     int total_pixels = width * 
height;
 
  290     unsigned char opcode;
 
  291     unsigned char flag = 0;
 
  293     int motion_x, motion_y;
 
  296     unsigned char *opcode_buffer = s->
buffer1;
 
  299     const unsigned char *imagedata_buffer = s->
buffer2;
 
  302     const unsigned char *huffman_segment;
 
  303     const unsigned char *size_segment;
 
  304     const unsigned char *vector_segment;
 
  305     const unsigned char *imagedata_segment;
 
  306     const unsigned char *buf_end = s->
buf + s->
size;
 
  307     int huffman_offset, size_offset, vector_offset, imagedata_offset,
 
  318     if (huffman_offset   >= s->
size ||
 
  319         size_offset      >= s->
size ||
 
  320         vector_offset    >= s->
size ||
 
  321         imagedata_offset >= s->
size)
 
  324     huffman_segment   = s->
buf + huffman_offset;
 
  325     size_segment      = s->
buf + size_offset;
 
  326     vector_segment    = s->
buf + vector_offset;
 
  327     imagedata_segment = s->
buf + imagedata_offset;
 
  330                            huffman_segment, s->
size - huffman_offset) < 0)
 
  333     if (imagedata_segment[0] == 2) {
 
  335                    &imagedata_segment[1], s->
size - imagedata_offset - 1);
 
  338         imagedata_size = s->
size - imagedata_offset - 1;
 
  339         imagedata_buffer = &imagedata_segment[1];
 
  344     while (total_pixels && opcode_buffer < opcode_buffer_end) {
 
  346         opcode = *opcode_buffer++;
 
  373             size += (opcode - 10);
 
  378             if (buf_end - size_segment < 1) {
 
  382             size = *size_segment++;
 
  387             if (buf_end - size_segment < 2) {
 
  391             size = 
AV_RB16(&size_segment[0]);
 
  397             if (buf_end - size_segment < 3) {
 
  406         if (size > total_pixels)
 
  416                 if (imagedata_size < size)
 
  419                 imagedata_buffer += 
size;
 
  420                 imagedata_size -= 
size;
 
  423             if (vector_segment >= buf_end) {
 
  439         total_pixels -= 
size;
 
  440         y += (x + 
size) / width;
 
  441         x  = (x + 
size) % width;
 
  447 static inline unsigned mul(
unsigned a, 
unsigned b)
 
  449     return (a * b) >> 16;
 
  452 static inline unsigned pow4(
unsigned a)
 
  454     unsigned square = mul(a, a);
 
  455     return mul(square, square);
 
  458 static inline unsigned pow5(
unsigned a)
 
  460     return mul(pow4(a), a);
 
  464     unsigned lo, hi = 0xff40, target;
 
  466     in = (in << 2) | (in >> 6);
 
  472     lo = target = in << 8;
 
  474         unsigned mid = (lo + hi) >> 1;
 
  475         unsigned pow = pow5(mid);
 
  476         if (pow > target) hi = mid;
 
  479     return (pow4((lo + hi) >> 1) + 0x80) >> 8;
 
  494     0x00, 0x09, 0x10, 0x16, 0x1C, 0x21, 0x27, 0x2C,
 
  495     0x31, 0x35, 0x3A, 0x3F, 0x43, 0x48, 0x4C, 0x50,
 
  496     0x54, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71,
 
  497     0x75, 0x79, 0x7D, 0x80, 0x84, 0x88, 0x8C, 0x8F,
 
  498     0x93, 0x97, 0x9A, 0x9E, 0xA2, 0xA5, 0xA9, 0xAC,
 
  499     0xB0, 0xB3, 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8,
 
  500     0xCB, 0xCF, 0xD2, 0xD5, 0xD9, 0xDC, 0xDF, 0xE3,
 
  501     0xE6, 0xE9, 0xED, 0xF0, 0xF3, 0xF6, 0xFA, 0xFD,
 
  502     0x03, 0x0B, 0x12, 0x18, 0x1D, 0x23, 0x28, 0x2D,
 
  503     0x32, 0x36, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x51,
 
  504     0x56, 0x5A, 0x5E, 0x62, 0x66, 0x6A, 0x6E, 0x72,
 
  505     0x76, 0x7A, 0x7D, 0x81, 0x85, 0x89, 0x8D, 0x90,
 
  506     0x94, 0x98, 0x9B, 0x9F, 0xA2, 0xA6, 0xAA, 0xAD,
 
  507     0xB1, 0xB4, 0xB8, 0xBB, 0xBF, 0xC2, 0xC5, 0xC9,
 
  508     0xCC, 0xD0, 0xD3, 0xD6, 0xDA, 0xDD, 0xE0, 0xE4,
 
  509     0xE7, 0xEA, 0xED, 0xF1, 0xF4, 0xF7, 0xFA, 0xFD,
 
  510     0x05, 0x0D, 0x13, 0x19, 0x1F, 0x24, 0x29, 0x2E,
 
  511     0x33, 0x38, 0x3C, 0x41, 0x45, 0x4A, 0x4E, 0x52,
 
  512     0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x6F, 0x73,
 
  513     0x77, 0x7B, 0x7E, 0x82, 0x86, 0x8A, 0x8D, 0x91,
 
  514     0x95, 0x99, 0x9C, 0xA0, 0xA3, 0xA7, 0xAA, 0xAE,
 
  515     0xB2, 0xB5, 0xB9, 0xBC, 0xBF, 0xC3, 0xC6, 0xCA,
 
  516     0xCD, 0xD0, 0xD4, 0xD7, 0xDA, 0xDE, 0xE1, 0xE4,
 
  517     0xE8, 0xEB, 0xEE, 0xF1, 0xF5, 0xF8, 0xFB, 0xFD,
 
  518     0x07, 0x0E, 0x15, 0x1A, 0x20, 0x25, 0x2A, 0x2F,
 
  519     0x34, 0x39, 0x3D, 0x42, 0x46, 0x4B, 0x4F, 0x53,
 
  520     0x58, 0x5C, 0x60, 0x64, 0x68, 0x6C, 0x70, 0x74,
 
  521     0x78, 0x7C, 0x7F, 0x83, 0x87, 0x8B, 0x8E, 0x92,
 
  522     0x96, 0x99, 0x9D, 0xA1, 0xA4, 0xA8, 0xAB, 0xAF,
 
  523     0xB2, 0xB6, 0xB9, 0xBD, 0xC0, 0xC4, 0xC7, 0xCB,
 
  524     0xCE, 0xD1, 0xD5, 0xD8, 0xDB, 0xDF, 0xE2, 0xE5,
 
  525     0xE9, 0xEC, 0xEF, 0xF2, 0xF6, 0xF9, 0xFC, 0xFD
 
  530                             void *
data, 
int *got_frame,
 
  535     int ret, buf_size = avpkt->
size;
 
  546         tag  = bytestream2_get_le32(&ctx);
 
  547         size = bytestream2_get_be32(&ctx);
 
  567                 int r = gamma_corr(bytestream2_get_byteu(&ctx));
 
  568                 int g = gamma_corr(bytestream2_get_byteu(&ctx));
 
  569                 int b = gamma_corr(bytestream2_get_byteu(&ctx));
 
  571                 int r = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  572                 int g = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  573                 int b = gamma_lookup[bytestream2_get_byteu(&ctx)];
 
  575                 *tmpptr++ = (0xFF
U << 24) | (r << 16) | (g << 8) | b;
 
  582             new_pal = bytestream2_get_le32(&ctx);
 
  583             if (new_pal < s->palettes_count) {
 
  608     memcpy(frame->
data[1],