36 #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
113 const uint8_t *
src,
int src_len)
115 uint8_t
byte = *
src++;
116 uint8_t ival =
byte + 0x16;
117 const uint8_t * ptr =
src +
byte*2;
118 int ptr_len = src_len - 1 -
byte*2;
120 uint8_t *dest_end = dest + dest_len;
121 uint8_t *dest_start = dest;
128 while (
val != 0x16) {
138 if (dest >= dest_end)
145 return dest - dest_start;
154 const uint8_t *
src,
int src_len)
158 uint8_t *dest_org = dest;
159 uint8_t *dest_end = dest + dest_len;
164 opcode = bytestream2_get_byte(&
ctx);
168 if ((opcode & 0x80) == 0) {
171 back = ((opcode & 0x60) << 3) + bytestream2_get_byte(&
ctx) + 1;
172 size2 = ((opcode & 0x1c) >> 2) + 3;
173 }
else if ((opcode & 0x40) == 0) {
174 size = bytestream2_peek_byte(&
ctx) >> 6;
176 back = (bytestream2_get_be16(&
ctx) & 0x3fff) + 1;
177 size2 = (opcode & 0x3f) + 4;
181 back = ((opcode & 0x10) << 12) + bytestream2_get_be16(&
ctx) + 1;
182 size2 = ((opcode & 0x0c) << 6) + bytestream2_get_byte(&
ctx) + 5;
185 if (dest_end - dest <
size + size2 ||
186 dest +
size - dest_org < back ||
194 int finish = opcode >= 0xfc;
195 size =
finish ? opcode & 3 : ((opcode & 0x1f) << 2) + 4;
208 const uint8_t *pixel_buffer,
int x,
int y,
int pixel_count)
214 int width =
s->avctx->width;
215 uint8_t *palette_plane;
217 palette_plane =
frame->data[0];
222 while (pixel_count && index < s->
frame_size) {
223 int count =
FFMIN(pixel_count,
width - current_x);
224 memcpy(palette_plane +
index, pixel_buffer, count);
225 pixel_count -= count;
227 pixel_buffer += count;
230 if (current_x >=
width) {
239 int pixel_count,
int motion_x,
244 int curframe_index, prevframe_index;
245 int curframe_x, prevframe_x;
246 int width =
s->avctx->width;
247 uint8_t *palette_plane, *prev_palette_plane;
249 if (y + motion_y < 0 || y + motion_y >=
s->avctx->height ||
250 x + motion_x < 0 || x + motion_x >=
s->avctx->width)
253 palette_plane =
frame->data[0];
254 prev_palette_plane =
s->last_frame->data[0];
255 if (!prev_palette_plane)
256 prev_palette_plane = palette_plane;
259 curframe_index = y *
stride + x;
261 prevframe_index = (y + motion_y) *
stride + x + motion_x;
262 prevframe_x = x + motion_x;
264 if (prev_palette_plane == palette_plane &&
FFABS(motion_x +
width*motion_y) < pixel_count) {
269 while (pixel_count &&
272 int count =
FFMIN3(pixel_count,
width - curframe_x,
273 width - prevframe_x);
275 memcpy(palette_plane + curframe_index,
276 prev_palette_plane + prevframe_index, count);
277 pixel_count -= count;
278 curframe_index += count;
279 prevframe_index += count;
281 prevframe_x += count;
283 if (curframe_x >=
width) {
284 curframe_index += line_inc;
288 if (prevframe_x >=
width) {
289 prevframe_index += line_inc;
298 int width =
s->avctx->width;
304 int motion_x, motion_y;
307 uint8_t *opcode_buffer =
s->buffer1;
308 uint8_t *opcode_buffer_end =
s->buffer1 +
s->buffer1_size;
309 int opcode_buffer_size =
s->buffer1_size;
310 const uint8_t *imagedata_buffer =
s->buffer2;
313 const uint8_t *huffman_segment;
316 const uint8_t *imagedata_segment;
317 int huffman_offset, size_offset, vector_offset, imagedata_offset,
323 huffman_offset =
AV_RL16(&
s->buf[0]);
325 vector_offset =
AV_RL16(&
s->buf[4]);
326 imagedata_offset =
AV_RL16(&
s->buf[6]);
328 if (huffman_offset >=
s->size ||
329 size_offset >=
s->size ||
330 vector_offset >=
s->size ||
331 imagedata_offset >=
s->size)
334 huffman_segment =
s->buf + huffman_offset;
337 imagedata_segment =
s->buf + imagedata_offset;
340 huffman_segment,
s->size - huffman_offset)) < 0)
342 opcode_buffer_end = opcode_buffer +
ret;
344 if (imagedata_segment[0] == 2) {
346 &imagedata_segment[1],
s->size - imagedata_offset - 1);
347 imagedata_size =
s->buffer2_size;
349 imagedata_size =
s->size - imagedata_offset - 1;
350 imagedata_buffer = &imagedata_segment[1];
355 while (total_pixels && opcode_buffer < opcode_buffer_end) {
357 opcode = *opcode_buffer++;
384 size += (opcode - 10);
393 size = bytestream2_get_byte(&size_segment);
402 size = bytestream2_get_be16(&size_segment);
411 size = bytestream2_get_be24(&size_segment);
415 if (
size > total_pixels)
425 if (imagedata_size <
size)
428 imagedata_buffer +=
size;
429 imagedata_size -=
size;
438 vector = bytestream2_get_byte(&vector_segment);
449 total_pixels -=
size;
457 static inline unsigned mul(
unsigned a,
unsigned b)
459 return (
a *
b) >> 16;
462 static inline unsigned pow4(
unsigned a)
468 static inline unsigned pow5(
unsigned a)
470 return mul(pow4(
a),
a);
473 static uint8_t gamma_corr(uint8_t in) {
474 unsigned lo, hi = 0xff40, target;
476 in = (in << 2) | (in >> 6);
482 lo = target = in << 8;
484 unsigned mid = (lo + hi) >> 1;
485 unsigned pow = pow5(mid);
486 if (pow > target) hi = mid;
489 return (pow4((lo + hi) >> 1) + 0x80) >> 8;
504 0x00, 0x09, 0x10, 0x16, 0x1C, 0x21, 0x27, 0x2C,
505 0x31, 0x35, 0x3A, 0x3F, 0x43, 0x48, 0x4C, 0x50,
506 0x54, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71,
507 0x75, 0x79, 0x7D, 0x80, 0x84, 0x88, 0x8C, 0x8F,
508 0x93, 0x97, 0x9A, 0x9E, 0xA2, 0xA5, 0xA9, 0xAC,
509 0xB0, 0xB3, 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8,
510 0xCB, 0xCF, 0xD2, 0xD5, 0xD9, 0xDC, 0xDF, 0xE3,
511 0xE6, 0xE9, 0xED, 0xF0, 0xF3, 0xF6, 0xFA, 0xFD,
512 0x03, 0x0B, 0x12, 0x18, 0x1D, 0x23, 0x28, 0x2D,
513 0x32, 0x36, 0x3B, 0x40, 0x44, 0x49, 0x4D, 0x51,
514 0x56, 0x5A, 0x5E, 0x62, 0x66, 0x6A, 0x6E, 0x72,
515 0x76, 0x7A, 0x7D, 0x81, 0x85, 0x89, 0x8D, 0x90,
516 0x94, 0x98, 0x9B, 0x9F, 0xA2, 0xA6, 0xAA, 0xAD,
517 0xB1, 0xB4, 0xB8, 0xBB, 0xBF, 0xC2, 0xC5, 0xC9,
518 0xCC, 0xD0, 0xD3, 0xD6, 0xDA, 0xDD, 0xE0, 0xE4,
519 0xE7, 0xEA, 0xED, 0xF1, 0xF4, 0xF7, 0xFA, 0xFD,
520 0x05, 0x0D, 0x13, 0x19, 0x1F, 0x24, 0x29, 0x2E,
521 0x33, 0x38, 0x3C, 0x41, 0x45, 0x4A, 0x4E, 0x52,
522 0x57, 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x6F, 0x73,
523 0x77, 0x7B, 0x7E, 0x82, 0x86, 0x8A, 0x8D, 0x91,
524 0x95, 0x99, 0x9C, 0xA0, 0xA3, 0xA7, 0xAA, 0xAE,
525 0xB2, 0xB5, 0xB9, 0xBC, 0xBF, 0xC3, 0xC6, 0xCA,
526 0xCD, 0xD0, 0xD4, 0xD7, 0xDA, 0xDE, 0xE1, 0xE4,
527 0xE8, 0xEB, 0xEE, 0xF1, 0xF5, 0xF8, 0xFB, 0xFD,
528 0x07, 0x0E, 0x15, 0x1A, 0x20, 0x25, 0x2A, 0x2F,
529 0x34, 0x39, 0x3D, 0x42, 0x46, 0x4B, 0x4F, 0x53,
530 0x58, 0x5C, 0x60, 0x64, 0x68, 0x6C, 0x70, 0x74,
531 0x78, 0x7C, 0x7F, 0x83, 0x87, 0x8B, 0x8E, 0x92,
532 0x96, 0x99, 0x9D, 0xA1, 0xA4, 0xA8, 0xAB, 0xAF,
533 0xB2, 0xB6, 0xB9, 0xBD, 0xC0, 0xC4, 0xC7, 0xCB,
534 0xCE, 0xD1, 0xD5, 0xD8, 0xDB, 0xDF, 0xE2, 0xE5,
535 0xE9, 0xEC, 0xEF, 0xF2, 0xF6, 0xF9, 0xFC, 0xFD
542 const uint8_t *buf = avpkt->
data;
543 int ret, buf_size = avpkt->
size;
554 tag = bytestream2_get_le32(&
ctx);
555 size = bytestream2_get_be32(&
ctx);
571 s->palettes = tmpptr;
575 int r = gamma_corr(bytestream2_get_byteu(&
ctx));
576 int g = gamma_corr(bytestream2_get_byteu(&
ctx));
577 int b = gamma_corr(bytestream2_get_byteu(&
ctx));
583 *tmpptr++ = (0xFF
U << 24) | (
r << 16) | (
g << 8) |
b;
590 new_pal = bytestream2_get_le32(&
ctx);
591 if (new_pal < s->palettes_count) {
592 s->cur_palette = new_pal;
605 if (
s->palettes_count <= 0) {
614 s->frame_size =
frame->linesize[0] *
s->avctx->height;
616 memcpy(
frame->data[1],