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],