54 #define VMD_HEADER_SIZE 0x330
55 #define PALETTE_COUNT 256
66 const unsigned char *
buf;
76 #define QUEUE_SIZE 0x1000
77 #define QUEUE_MASK 0x0FFF
80 unsigned char *dest,
int dest_len)
86 unsigned int dataleft;
87 unsigned int chainofs;
88 unsigned int chainlen;
97 dataleft = bytestream2_get_le32(&gb);
101 if (bytestream2_peek_le32(&gb) == 0x56781234) {
111 tag = bytestream2_get_byteu(&gb);
112 if ((tag == 0xFF) && (dataleft > 8)) {
115 for (i = 0; i < 8; i++) {
116 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
121 for (i = 0; i < 8; i++) {
127 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
131 chainofs = bytestream2_get_byte(&gb);
132 chainofs |= ((bytestream2_peek_byte(&gb) & 0xF0) << 4);
133 chainlen = (bytestream2_get_byte(&gb) & 0x0F) + 3;
134 if (chainlen == speclen) {
135 chainlen = bytestream2_get_byte(&gb) + 0xF + 3;
137 if (d_end - d < chainlen)
139 for (j = 0; j < chainlen; j++) {
141 queue[qpos++] = *d++;
144 dataleft -= chainlen;
153 int src_count,
int src_size,
int dest_len)
157 unsigned char *dest_end = dest + dest_len;
166 *pd++ = bytestream2_get_byteu(&gb);
173 l = bytestream2_get_byteu(&gb);
184 for (i = 0; i < l; i++) {
191 }
while (used < src_count);
199 unsigned int *palette32;
200 unsigned char r,
g,
b;
210 int frame_x, frame_y;
211 int frame_width, frame_height;
215 frame_width =
AV_RL16(&s->
buf[10]) - frame_x + 1;
216 frame_height =
AV_RL16(&s->
buf[12]) - frame_y + 1;
219 (frame_x || frame_y)) {
227 if (frame_x < 0 || frame_width < 0 ||
232 "Invalid horizontal range %d-%d\n",
233 frame_x, frame_width);
236 if (frame_y < 0 || frame_height < 0 ||
241 "Invalid vertical range %d-%d\n",
242 frame_x, frame_width);
249 (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
258 if (s->
buf[15] & 0x02) {
260 palette32 = (
unsigned int *)s->
palette;
263 r = bytestream2_get_byteu(&gb) * 4;
264 g = bytestream2_get_byteu(&gb) * 4;
265 b = bytestream2_get_byteu(&gb) * 4;
266 palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
267 palette32[i] |= palette32[i] >> 6 & 0x30303;
281 meth = bytestream2_get_byteu(&gb);
286 "Trying to unpack LZ-compressed frame with no LZ buffer\n");
297 dp = &frame->
data[0][frame_y * frame->
linesize[0] + frame_x];
301 for (i = 0; i < frame_height; i++) {
304 len = bytestream2_get_byte(&gb);
306 len = (len & 0x7F) + 1;
307 if (ofs + len > frame_width ||
316 memcpy(&dp[ofs], &pp[ofs], len + 1);
319 }
while (ofs < frame_width);
320 if (ofs > frame_width) {
322 "offset > width (%d > %d)\n",
332 for (i = 0; i < frame_height; i++) {
340 for (i = 0; i < frame_height; i++) {
343 len = bytestream2_get_byte(&gb);
345 len = (len & 0x7F) + 1;
346 if (bytestream2_peek_byte(&gb) == 0xFF) {
348 bytestream2_get_byte(&gb);
362 memcpy(&dp[ofs], &pp[ofs], len + 1);
365 }
while (ofs < frame_width);
366 if (ofs > frame_width) {
368 "offset > width (%d > %d)\n",
395 unsigned int *palette32;
396 int palette_index = 0;
397 unsigned char r,
g,
b;
398 unsigned char *vmd_header;
399 unsigned char *raw_palette;
410 vmd_header = (
unsigned char *)avctx->
extradata;
420 raw_palette = &vmd_header[28];
421 palette32 = (
unsigned int *)s->
palette;
423 r = raw_palette[palette_index++] * 4;
424 g = raw_palette[palette_index++] * 4;
425 b = raw_palette[palette_index++] * 4;
426 palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
427 palette32[i] |= palette32[i] >> 6 & 0x30303;
440 void *
data,
int *got_frame,
444 int buf_size = avpkt->
size;
479 #define BLOCK_TYPE_AUDIO 1
480 #define BLOCK_TYPE_INITIAL 2
481 #define BLOCK_TYPE_SILENCE 3
489 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
490 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
491 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
492 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
493 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
494 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
495 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
496 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
497 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
498 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
499 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
500 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
501 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
529 "block align = %d, sample rate = %d\n",
540 const uint8_t *buf_end = buf + buf_size;
542 int st = channels - 1;
545 for (ch = 0; ch < channels; ch++) {
546 predictor[ch] = (int16_t)
AV_RL16(buf);
548 *out++ = predictor[ch];
553 while (buf < buf_end) {
559 predictor[ch] = av_clip_int16(predictor[ch]);
560 *out++ = predictor[ch];
566 int *got_frame_ptr,
AVPacket *avpkt)
571 int buf_size = avpkt->
size;
573 int block_type, silent_chunks, audio_chunks;
576 int16_t *output_samples_s16;
601 silent_chunks = av_popcount(flags);
604 }
else if (block_type == BLOCK_TYPE_SILENCE) {
620 output_samples_u8 = frame->
data[0];
621 output_samples_s16 = (int16_t *)frame->
data[0];
624 if (silent_chunks > 0) {
625 int silent_size = avctx->
block_align * silent_chunks;
629 memset(output_samples_s16, 0x00, silent_size * 2);
630 output_samples_s16 += silent_size;
632 memset(output_samples_u8, 0x80, silent_size);
633 output_samples_u8 += silent_size;
638 if (audio_chunks > 0) {
639 buf_end = buf + buf_size;
647 memcpy(output_samples_u8, buf, s->
chunk_size);