53 #define VMD_HEADER_SIZE 0x330
54 #define PALETTE_COUNT 256
65 const unsigned char *
buf;
75 #define QUEUE_SIZE 0x1000
76 #define QUEUE_MASK 0x0FFF
78 static void lz_unpack(
const unsigned char *src,
int src_len,
79 unsigned char *dest,
int dest_len)
85 unsigned int dataleft;
86 unsigned int chainofs;
87 unsigned int chainlen;
96 dataleft = bytestream2_get_le32(&gb);
100 if (bytestream2_peek_le32(&gb) == 0x56781234) {
101 bytestream2_get_le32(&gb);
110 tag = bytestream2_get_byteu(&gb);
111 if ((tag == 0xFF) && (dataleft > 8)) {
114 for (i = 0; i < 8; i++) {
115 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
120 for (i = 0; i < 8; i++) {
126 queue[qpos++] = *d++ = bytestream2_get_byte(&gb);
130 chainofs = bytestream2_get_byte(&gb);
131 chainofs |= ((bytestream2_peek_byte(&gb) & 0xF0) << 4);
132 chainlen = (bytestream2_get_byte(&gb) & 0x0F) + 3;
133 if (chainlen == speclen) {
134 chainlen = bytestream2_get_byte(&gb) + 0xF + 3;
136 if (d + chainlen > d_end)
138 for (j = 0; j < chainlen; j++) {
140 queue[qpos++] = *d++;
143 dataleft -= chainlen;
151 static int rle_unpack(
const unsigned char *src,
unsigned char *dest,
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;
216 if (frame_x < 0 || frame_width < 0 ||
221 "Invalid horizontal range %d-%d\n",
222 frame_x, frame_width);
225 if (frame_y < 0 || frame_height < 0 ||
230 "Invalid vertical range %d-%d\n",
231 frame_x, frame_width);
236 (frame_x || frame_y)) {
247 (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
256 if (s->
buf[15] & 0x02) {
258 palette32 = (
unsigned int *)s->
palette;
261 r = bytestream2_get_byteu(&gb) * 4;
262 g = bytestream2_get_byteu(&gb) * 4;
263 b = bytestream2_get_byteu(&gb) * 4;
264 palette32[i] = (r << 16) | (g << 8) | (
b);
279 meth = bytestream2_get_byteu(&gb);
283 "Trying to unpack LZ-compressed frame with no LZ buffer\n");
292 dp = &frame->
data[0][frame_y * frame->
linesize[0] + frame_x];
296 for (i = 0; i < frame_height; i++) {
299 len = bytestream2_get_byte(&gb);
301 len = (len & 0x7F) + 1;
302 if (ofs + len > frame_width ||
311 memcpy(&dp[ofs], &pp[ofs], len + 1);
314 }
while (ofs < frame_width);
315 if (ofs > frame_width) {
317 "VMD video: offset > width (%d > %d)\n",
327 for (i = 0; i < frame_height; i++) {
335 for (i = 0; i < frame_height; i++) {
338 len = bytestream2_get_byte(&gb);
340 len = (len & 0x7F) + 1;
341 if (bytestream2_peek_byte(&gb) == 0xFF) {
343 bytestream2_get_byte(&gb);
357 memcpy(&dp[ofs], &pp[ofs], len + 1);
360 }
while (ofs < frame_width);
361 if (ofs > frame_width) {
363 "VMD video: offset > width (%d > %d)\n",
389 unsigned int *palette32;
390 int palette_index = 0;
391 unsigned char r,
g,
b;
392 unsigned char *vmd_header;
393 unsigned char *raw_palette;
404 vmd_header = (
unsigned char *)avctx->
extradata;
414 raw_palette = &vmd_header[28];
415 palette32 = (
unsigned int *)s->
palette;
417 r = raw_palette[palette_index++] * 4;
418 g = raw_palette[palette_index++] * 4;
419 b = raw_palette[palette_index++] * 4;
420 palette32[i] = (r << 16) | (g << 8) | (
b);
433 void *
data,
int *got_frame,
437 int buf_size = avpkt->
size;
475 #define BLOCK_TYPE_AUDIO 1
476 #define BLOCK_TYPE_INITIAL 2
477 #define BLOCK_TYPE_SILENCE 3
485 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
486 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
487 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
488 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
489 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
490 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
491 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
492 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
493 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
494 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
495 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
496 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
497 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
525 "block align = %d, sample rate = %d\n",
536 const uint8_t *buf_end = buf + buf_size;
538 int st = channels - 1;
541 for (ch = 0; ch < channels; ch++) {
542 predictor[ch] = (int16_t)
AV_RL16(buf);
544 *out++ = predictor[ch];
549 while (buf < buf_end) {
555 predictor[ch] = av_clip_int16(predictor[ch]);
556 *out++ = predictor[ch];
562 int *got_frame_ptr,
AVPacket *avpkt)
567 int buf_size = avpkt->
size;
569 int block_type, silent_chunks, audio_chunks;
572 int16_t *output_samples_s16;
597 silent_chunks = av_popcount(flags);
600 }
else if (block_type == BLOCK_TYPE_SILENCE) {
618 output_samples_u8 = frame->
data[0];
619 output_samples_s16 = (int16_t *)frame->
data[0];
622 if (silent_chunks > 0) {
626 memset(output_samples_s16, 0x00, silent_size * 2);
627 output_samples_s16 += silent_size;
629 memset(output_samples_u8, 0x80, silent_size);
630 output_samples_u8 += silent_size;
635 if (audio_chunks > 0) {
636 buf_end = buf + (buf_size & ~(avctx->
channels > 1));
643 memcpy(output_samples_u8, buf, s->
chunk_size);