38 #define BITSTREAM_READER_LE
44 #define RUNTIME_GAMMA 0
46 #define VGA__TAG MKTAG('V', 'G', 'A', ' ')
47 #define PALT_TAG MKTAG('P', 'A', 'L', 'T')
48 #define SHOT_TAG MKTAG('S', 'H', 'O', 'T')
49 #define PALETTE_COUNT 256
50 #define PALETTE_SIZE (PALETTE_COUNT * 3)
51 #define PALETTES_MAX 256
114 const uint8_t *
src,
int src_len)
116 uint8_t
byte = *
src++;
117 uint8_t ival =
byte + 0x16;
118 const uint8_t * ptr =
src +
byte*2;
119 int ptr_len = src_len - 1 -
byte*2;
121 uint8_t *dest_end = dest + dest_len;
122 uint8_t *dest_start = dest;
129 while (
val != 0x16) {
139 if (dest >= dest_end)
146 return dest - dest_start;
155 const uint8_t *
src,
int src_len)
159 uint8_t *dest_org = dest;
160 uint8_t *dest_end = dest + dest_len;
165 opcode = bytestream2_get_byte(&
ctx);
169 if ((opcode & 0x80) == 0) {
172 back = ((opcode & 0x60) << 3) + bytestream2_get_byte(&
ctx) + 1;
173 size2 = ((opcode & 0x1c) >> 2) + 3;
174 }
else if ((opcode & 0x40) == 0) {
175 size = bytestream2_peek_byte(&
ctx) >> 6;
177 back = (bytestream2_get_be16(&
ctx) & 0x3fff) + 1;
178 size2 = (opcode & 0x3f) + 4;
182 back = ((opcode & 0x10) << 12) + bytestream2_get_be16(&
ctx) + 1;
183 size2 = ((opcode & 0x0c) << 6) + bytestream2_get_byte(&
ctx) + 5;
186 if (dest_end - dest <
size + size2 ||
187 dest +
size - dest_org < back ||
195 int finish = opcode >= 0xfc;
196 size =
finish ? opcode & 3 : ((opcode & 0x1f) << 2) + 4;
209 const uint8_t *pixel_buffer,
int x,
int y,
int pixel_count)
215 int width =
s->avctx->width;
216 uint8_t *palette_plane;
218 palette_plane =
frame->data[0];
223 while (pixel_count && index < s->
frame_size) {
224 int count =
FFMIN(pixel_count,
width - current_x);
225 memcpy(palette_plane +
index, pixel_buffer, count);
226 pixel_count -= count;
228 pixel_buffer += count;
231 if (current_x >=
width) {
240 int pixel_count,
int motion_x,
245 int curframe_index, prevframe_index;
246 int curframe_x, prevframe_x;
247 int width =
s->avctx->width;
248 uint8_t *palette_plane, *prev_palette_plane;
250 if (y + motion_y < 0 || y + motion_y >=
s->avctx->height ||
251 x + motion_x < 0 || x + motion_x >=
s->avctx->width)
254 palette_plane =
frame->data[0];
255 prev_palette_plane =
s->last_frame->data[0];
256 if (!prev_palette_plane)
257 prev_palette_plane = palette_plane;
260 curframe_index = y *
stride + x;
262 prevframe_index = (y + motion_y) *
stride + x + motion_x;
263 prevframe_x = x + motion_x;
265 if (prev_palette_plane == palette_plane &&
FFABS(motion_x +
width*motion_y) < pixel_count) {
270 while (pixel_count &&
273 int count =
FFMIN3(pixel_count,
width - curframe_x,
274 width - prevframe_x);
276 memcpy(palette_plane + curframe_index,
277 prev_palette_plane + prevframe_index, count);
278 pixel_count -= count;
279 curframe_index += count;
280 prevframe_index += count;
282 prevframe_x += count;
284 if (curframe_x >=
width) {
285 curframe_index += line_inc;
289 if (prevframe_x >=
width) {
290 prevframe_index += line_inc;
299 int width =
s->avctx->width;
305 int motion_x, motion_y;
308 uint8_t *opcode_buffer =
s->buffer1;
309 uint8_t *opcode_buffer_end =
s->buffer1 +
s->buffer1_size;
310 int opcode_buffer_size =
s->buffer1_size;
311 const uint8_t *imagedata_buffer =
s->buffer2;
314 const uint8_t *huffman_segment;
317 const uint8_t *imagedata_segment;
318 int huffman_offset, size_offset, vector_offset, imagedata_offset,
324 huffman_offset =
AV_RL16(&
s->buf[0]);
326 vector_offset =
AV_RL16(&
s->buf[4]);
327 imagedata_offset =
AV_RL16(&
s->buf[6]);
329 if (huffman_offset >=
s->size ||
330 size_offset >=
s->size ||
331 vector_offset >=
s->size ||
332 imagedata_offset >=
s->size)
335 huffman_segment =
s->buf + huffman_offset;
338 imagedata_segment =
s->buf + imagedata_offset;
341 huffman_segment,
s->size - huffman_offset)) < 0)
343 opcode_buffer_end = opcode_buffer +
ret;
345 if (imagedata_segment[0] == 2) {
347 &imagedata_segment[1],
s->size - imagedata_offset - 1);
348 imagedata_size =
s->buffer2_size;
350 imagedata_size =
s->size - imagedata_offset - 1;
351 imagedata_buffer = &imagedata_segment[1];
356 while (total_pixels && opcode_buffer < opcode_buffer_end) {
358 opcode = *opcode_buffer++;
385 size += (opcode - 10);
394 size = bytestream2_get_byte(&size_segment);
403 size = bytestream2_get_be16(&size_segment);
412 size = bytestream2_get_be24(&size_segment);
416 if (
size > total_pixels)
426 if (imagedata_size <
size)
429 imagedata_buffer +=
size;
430 imagedata_size -=
size;
439 vector = bytestream2_get_byte(&vector_segment);
450 total_pixels -=
size;
458 static inline unsigned mul(
unsigned a,
unsigned b)
460 return (
a *
b) >> 16;
463 static inline unsigned pow4(
unsigned a)
469 static inline unsigned pow5(
unsigned a)
471 return mul(pow4(
a),
a);
474 static uint8_t gamma_corr(uint8_t in) {
475 unsigned lo, hi = 0xff40, target;
477 in = (in << 2) | (in >> 6);
483 lo = target = in << 8;
485 unsigned mid = (lo + hi) >> 1;
486 unsigned pow = pow5(mid);
487 if (pow > target) hi = mid;
490 return (pow4((lo + hi) >> 1) + 0x80) >> 8;
505 0x00, 0x09, 0x10, 0x16, 0x1C, 0x21, 0x27, 0x2C,
506 0x31, 0x35, 0x3A, 0x3F, 0x43, 0x48, 0x4C, 0x50,
507 0x54, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71,
508 0x75, 0x79, 0x7D, 0x80, 0x84, 0x88, 0x8C, 0x8F,
509 0x93, 0x97, 0x9A, 0x9E, 0xA2, 0xA5, 0xA9, 0xAC,
510 0xB0, 0xB3, 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8,
511 0xCB, 0xCF, 0xD2, 0xD5, 0xD9, 0xDC, 0xDF, 0xE3,
512 0xE6, 0xE9, 0xED, 0xF0, 0xF3, 0xF6, 0xFA, 0xFD,
513 0x03, 0x0B, 0x12, 0x18, 0x1D, 0x23, 0x28, 0x2D,
514 0x32, 0x36, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x51,
515 0x56, 0x5A, 0x5E, 0x62, 0x66, 0x6A, 0x6E, 0x72,
516 0x76, 0x7A, 0x7D, 0x81, 0x85, 0x89, 0x8D, 0x90,
517 0x94, 0x98, 0x9B, 0x9F, 0xA2, 0xA6, 0xAA, 0xAD,
518 0xB1, 0xB4, 0xB8, 0xBB, 0xBF, 0xC2, 0xC5, 0xC9,
519 0xCC, 0xD0, 0xD3, 0xD6, 0xDA, 0xDD, 0xE0, 0xE4,
520 0xE7, 0xEA, 0xED, 0xF1, 0xF4, 0xF7, 0xFA, 0xFD,
521 0x05, 0x0D, 0x13, 0x19, 0x1F, 0x24, 0x29, 0x2E,
522 0x33, 0x38, 0x3C, 0x41, 0x45, 0x4A, 0x4E, 0x52,
523 0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x6F, 0x73,
524 0x77, 0x7B, 0x7E, 0x82, 0x86, 0x8A, 0x8D, 0x91,
525 0x95, 0x99, 0x9C, 0xA0, 0xA3, 0xA7, 0xAA, 0xAE,
526 0xB2, 0xB5, 0xB9, 0xBC, 0xBF, 0xC3, 0xC6, 0xCA,
527 0xCD, 0xD0, 0xD4, 0xD7, 0xDA, 0xDE, 0xE1, 0xE4,
528 0xE8, 0xEB, 0xEE, 0xF1, 0xF5, 0xF8, 0xFB, 0xFD,
529 0x07, 0x0E, 0x15, 0x1A, 0x20, 0x25, 0x2A, 0x2F,
530 0x34, 0x39, 0x3D, 0x42, 0x46, 0x4B, 0x4F, 0x53,
531 0x58, 0x5C, 0x60, 0x64, 0x68, 0x6C, 0x70, 0x74,
532 0x78, 0x7C, 0x7F, 0x83, 0x87, 0x8B, 0x8E, 0x92,
533 0x96, 0x99, 0x9D, 0xA1, 0xA4, 0xA8, 0xAB, 0xAF,
534 0xB2, 0xB6, 0xB9, 0xBD, 0xC0, 0xC4, 0xC7, 0xCB,
535 0xCE, 0xD1, 0xD5, 0xD8, 0xDB, 0xDF, 0xE2, 0xE5,
536 0xE9, 0xEC, 0xEF, 0xF2, 0xF6, 0xF9, 0xFC, 0xFD
541 void *
data,
int *got_frame,
545 const uint8_t *buf = avpkt->
data;
546 int ret, buf_size = avpkt->
size;
557 tag = bytestream2_get_le32(&
ctx);
558 size = bytestream2_get_be32(&
ctx);
574 s->palettes = tmpptr;
578 int r = gamma_corr(bytestream2_get_byteu(&
ctx));
579 int g = gamma_corr(bytestream2_get_byteu(&
ctx));
580 int b = gamma_corr(bytestream2_get_byteu(&
ctx));
586 *tmpptr++ = (0xFF
U << 24) | (
r << 16) | (
g << 8) |
b;
593 new_pal = bytestream2_get_le32(&
ctx);
594 if (new_pal < s->palettes_count) {
595 s->cur_palette = new_pal;
608 if (
s->palettes_count <= 0) {
617 s->frame_size =
frame->linesize[0] *
s->avctx->height;
619 memcpy(
frame->data[1],