50 #define VMD_HEADER_SIZE 0x330
51 #define PALETTE_COUNT 256
63 const unsigned char *
buf;
73 #define QUEUE_SIZE 0x1000
74 #define QUEUE_MASK 0x0FFF
76 static void lz_unpack(
const unsigned char *src,
int src_len,
77 unsigned char *dest,
int dest_len)
83 unsigned int dataleft;
84 unsigned int chainofs;
85 unsigned int chainlen;
94 dataleft = bytestream2_get_le32(&gb);
98 if (bytestream2_peek_le32(&gb) == 0x56781234) {
99 bytestream2_get_le32(&gb);
108 tag = bytestream2_get_byteu(&gb);
109 if ((tag == 0xFF) && (dataleft > 8)) {
112 for (i = 0; i < 8; i++) {
113 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
118 for (i = 0; i < 8; i++) {
124 queue[qpos++] = *d++ = bytestream2_get_byte(&gb);
128 chainofs = bytestream2_get_byte(&gb);
129 chainofs |= ((bytestream2_peek_byte(&gb) & 0xF0) << 4);
130 chainlen = (bytestream2_get_byte(&gb) & 0x0F) + 3;
131 if (chainlen == speclen) {
132 chainlen = bytestream2_get_byte(&gb) + 0xF + 3;
134 if (d + chainlen > d_end)
136 for (j = 0; j < chainlen; j++) {
138 queue[qpos++] = *d++;
141 dataleft -= chainlen;
149 static int rle_unpack(
const unsigned char *src,
unsigned char *dest,
150 int src_count,
int src_size,
int dest_len)
154 unsigned char *dest_end = dest + dest_len;
162 *pd++ = bytestream2_get_byteu(&gb);
170 l = bytestream2_get_byteu(&gb);
180 for (i = 0; i < l; i++) {
181 *pd++ = bytestream2_get_byteu(&gb);
182 *pd++ = bytestream2_get_byteu(&gb);
187 }
while (i < src_count);
195 unsigned int *palette32;
196 unsigned char r,
g,
b;
206 int frame_x, frame_y;
211 frame_width =
AV_RL16(&s->
buf[10]) - frame_x + 1;
212 frame_height =
AV_RL16(&s->
buf[12]) - frame_y + 1;
213 if (frame_x < 0 || frame_width < 0 ||
218 if (frame_y < 0 || frame_height < 0 ||
225 (frame_x || frame_y)) {
236 (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
245 if (s->
buf[15] & 0x02) {
247 palette32 = (
unsigned int *)s->
palette;
250 r = bytestream2_get_byteu(&gb) * 4;
251 g = bytestream2_get_byteu(&gb) * 4;
252 b = bytestream2_get_byteu(&gb) * 4;
253 palette32[i] = (r << 16) | (g << 8) | (
b);
256 s->
size -= (256 * 3 + 2);
263 meth = bytestream2_get_byteu(&gb);
278 len = bytestream2_get_byte(&gb);
280 len = (len & 0x7F) + 1;
289 memcpy(&dp[ofs], &pp[ofs], len + 1);
292 }
while (ofs < frame_width);
293 if (ofs > frame_width) {
315 len = bytestream2_get_byte(&gb);
317 len = (len & 0x7F) + 1;
318 if (bytestream2_get_byte(&gb) == 0xFF)
329 memcpy(&dp[ofs], &pp[ofs], len + 1);
332 }
while (ofs < frame_width);
333 if (ofs > frame_width) {
349 unsigned int *palette32;
350 int palette_index = 0;
351 unsigned char r,
g,
b;
352 unsigned char *vmd_header;
353 unsigned char *raw_palette;
364 vmd_header = (
unsigned char *)avctx->
extradata;
372 raw_palette = &vmd_header[28];
373 palette32 = (
unsigned int *)s->
palette;
375 r = raw_palette[palette_index++] * 4;
376 g = raw_palette[palette_index++] * 4;
377 b = raw_palette[palette_index++] * 4;
378 palette32[i] = (r << 16) | (g << 8) | (
b);
385 void *
data,
int *data_size,
388 const uint8_t *buf = avpkt->
data;
389 int buf_size = avpkt->
size;
437 #define BLOCK_TYPE_AUDIO 1
438 #define BLOCK_TYPE_INITIAL 2
439 #define BLOCK_TYPE_SILENCE 3
448 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
449 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
450 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
451 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
452 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
453 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
454 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
455 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
456 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
457 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
458 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
459 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
460 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
488 "block align = %d, sample rate = %d\n",
499 const uint8_t *buf_end = buf + buf_size;
501 int st = channels - 1;
504 for (ch = 0; ch < channels; ch++) {
505 predictor[ch] = (int16_t)
AV_RL16(buf);
507 *out++ = predictor[ch];
512 while (buf < buf_end) {
518 predictor[ch] = av_clip_int16(predictor[ch]);
519 *out++ = predictor[ch];
525 int *got_frame_ptr,
AVPacket *avpkt)
527 const uint8_t *buf = avpkt->
data;
528 const uint8_t *buf_end;
529 int buf_size = avpkt->
size;
531 int block_type, silent_chunks, audio_chunks;
533 uint8_t *output_samples_u8;
534 int16_t *output_samples_s16;
559 silent_chunks = av_popcount(flags);
562 }
else if (block_type == BLOCK_TYPE_SILENCE) {
577 output_samples_s16 = (int16_t *)s->
frame.
data[0];
580 if (silent_chunks > 0) {
581 int silent_size = avctx->
block_align * silent_chunks;
583 memset(output_samples_s16, 0x00, silent_size * 2);
584 output_samples_s16 += silent_size;
586 memset(output_samples_u8, 0x80, silent_size);
587 output_samples_u8 += silent_size;
592 if (audio_chunks > 0) {
593 buf_end = buf + buf_size;
600 memcpy(output_samples_u8, buf, s->
chunk_size);