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;
152 int src_count,
int src_size,
int dest_len)
156 unsigned char *dest_end = dest + dest_len;
165 *pd++ = bytestream2_get_byteu(&gb);
172 l = bytestream2_get_byteu(&gb);
183 for (i = 0; i < l; i++) {
190 }
while (used < src_count);
198 unsigned int *palette32;
199 unsigned char r,
g,
b;
209 int frame_x, frame_y;
210 int frame_width, frame_height;
214 frame_width =
AV_RL16(&s->
buf[10]) - frame_x + 1;
215 frame_height =
AV_RL16(&s->
buf[12]) - frame_y + 1;
218 (frame_x || frame_y)) {
226 if (frame_x < 0 || frame_width < 0 ||
231 "Invalid horizontal range %d-%d\n",
232 frame_x, frame_width);
235 if (frame_y < 0 || frame_height < 0 ||
240 "Invalid vertical range %d-%d\n",
241 frame_x, frame_width);
248 (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
257 if (s->
buf[15] & 0x02) {
259 palette32 = (
unsigned int *)s->
palette;
262 r = bytestream2_get_byteu(&gb) * 4;
263 g = bytestream2_get_byteu(&gb) * 4;
264 b = bytestream2_get_byteu(&gb) * 4;
265 palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
266 palette32[i] |= palette32[i] >> 6 & 0x30303;
280 meth = bytestream2_get_byteu(&gb);
284 "Trying to unpack LZ-compressed frame with no LZ buffer\n");
293 dp = &frame->
data[0][frame_y * frame->
linesize[0] + frame_x];
297 for (i = 0; i < frame_height; i++) {
300 len = bytestream2_get_byte(&gb);
302 len = (len & 0x7F) + 1;
303 if (ofs + len > frame_width ||
312 memcpy(&dp[ofs], &pp[ofs], len + 1);
315 }
while (ofs < frame_width);
316 if (ofs > frame_width) {
318 "offset > width (%d > %d)\n",
328 for (i = 0; i < frame_height; i++) {
336 for (i = 0; i < frame_height; i++) {
339 len = bytestream2_get_byte(&gb);
341 len = (len & 0x7F) + 1;
342 if (bytestream2_peek_byte(&gb) == 0xFF) {
344 bytestream2_get_byte(&gb);
358 memcpy(&dp[ofs], &pp[ofs], len + 1);
361 }
while (ofs < frame_width);
362 if (ofs > frame_width) {
364 "offset > width (%d > %d)\n",
390 unsigned int *palette32;
391 int palette_index = 0;
392 unsigned char r,
g,
b;
393 unsigned char *vmd_header;
394 unsigned char *raw_palette;
405 vmd_header = (
unsigned char *)avctx->
extradata;
415 raw_palette = &vmd_header[28];
416 palette32 = (
unsigned int *)s->
palette;
418 r = raw_palette[palette_index++] * 4;
419 g = raw_palette[palette_index++] * 4;
420 b = raw_palette[palette_index++] * 4;
421 palette32[i] = 0xFF
U << 24 | (r << 16) | (g << 8) | (
b);
422 palette32[i] |= palette32[i] >> 6 & 0x30303;
435 void *
data,
int *got_frame,
439 int buf_size = avpkt->
size;
474 #define BLOCK_TYPE_AUDIO 1
475 #define BLOCK_TYPE_INITIAL 2
476 #define BLOCK_TYPE_SILENCE 3
484 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
485 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
486 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
487 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
488 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
489 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
490 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
491 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
492 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
493 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
494 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
495 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
496 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
524 "block align = %d, sample rate = %d\n",
535 const uint8_t *buf_end = buf + buf_size;
537 int st = channels - 1;
540 for (ch = 0; ch < channels; ch++) {
541 predictor[ch] = (int16_t)
AV_RL16(buf);
543 *out++ = predictor[ch];
548 while (buf < buf_end) {
554 predictor[ch] = av_clip_int16(predictor[ch]);
555 *out++ = predictor[ch];
561 int *got_frame_ptr,
AVPacket *avpkt)
566 int buf_size = avpkt->
size;
568 int block_type, silent_chunks, audio_chunks;
571 int16_t *output_samples_s16;
596 silent_chunks = av_popcount(flags);
599 }
else if (block_type == BLOCK_TYPE_SILENCE) {
615 output_samples_u8 = frame->
data[0];
616 output_samples_s16 = (int16_t *)frame->
data[0];
619 if (silent_chunks > 0) {
620 int silent_size = avctx->
block_align * silent_chunks;
624 memset(output_samples_s16, 0x00, silent_size * 2);
625 output_samples_s16 += silent_size;
627 memset(output_samples_u8, 0x80, silent_size);
628 output_samples_u8 += silent_size;
633 if (audio_chunks > 0) {
634 buf_end = buf + buf_size;
642 memcpy(output_samples_u8, buf, s->
chunk_size);