72
72
#define QUEUE_SIZE 0x1000
73
73
#define QUEUE_MASK 0x0FFF
75
static void lz_unpack(const unsigned char *src, unsigned char *dest, int dest_len)
75
static void lz_unpack(const unsigned char *src, int src_len,
76
unsigned char *dest, int dest_len)
77
78
const unsigned char *s;
79
81
unsigned char *d_end;
80
82
unsigned char queue[QUEUE_SIZE];
101
106
speclen = 100; /* no speclen */
104
while (dataleft > 0) {
109
while (dataleft > 0 && s_len > 0) {
106
111
if ((tag == 0xFF) && (dataleft > 8)) {
112
if (d + 8 > d_end || s_len < 8)
109
114
for (i = 0; i < 8; i++) {
110
115
queue[qpos++] = *d++ = *s++;
111
116
qpos &= QUEUE_MASK;
115
121
for (i = 0; i < 8; i++) {
116
122
if (dataleft == 0)
118
124
if (tag & 0x01) {
125
if (d + 1 > d_end || s_len < 1)
121
127
queue[qpos++] = *d++ = *s++;
122
128
qpos &= QUEUE_MASK;
126
135
chainofs |= ((*s & 0xF0) << 4);
127
136
chainlen = (*s++ & 0x0F) + 3;
128
if (chainlen == speclen)
138
if (chainlen == speclen) {
129
141
chainlen = *s++ + 0xF + 3;
130
144
if (d + chainlen > d_end)
132
146
for (j = 0; j < chainlen; j++) {
204
228
frame_y = AV_RL16(&s->buf[8]);
205
229
frame_width = AV_RL16(&s->buf[10]) - frame_x + 1;
206
230
frame_height = AV_RL16(&s->buf[12]) - frame_y + 1;
231
if (frame_x < 0 || frame_width < 0 ||
232
frame_x >= s->avctx->width ||
233
frame_width > s->avctx->width ||
234
frame_x + frame_width > s->avctx->width)
236
if (frame_y < 0 || frame_height < 0 ||
237
frame_y >= s->avctx->height ||
238
frame_height > s->avctx->height ||
239
frame_y + frame_height > s->avctx->height)
208
242
if ((frame_width == s->avctx->width && frame_height == s->avctx->height) &&
209
243
(frame_x || frame_y)) {
217
251
/* if only a certain region will be updated, copy the entire previous
218
252
* frame before the decode */
219
if (frame_x || frame_y || (frame_width != s->avctx->width) ||
220
(frame_height != s->avctx->height)) {
253
if (s->prev_frame.data[0] &&
254
(frame_x || frame_y || (frame_width != s->avctx->width) ||
255
(frame_height != s->avctx->height))) {
222
257
memcpy(s->frame.data[0], s->prev_frame.data[0],
223
258
s->avctx->height * s->frame.linesize[0]);
236
271
s->size -= (256 * 3 + 2);
239
274
/* originally UnpackFrame in VAG's code */
276
pb_size = s->buf + s->size - pb;
279
meth = *pb++; pb_size--;
242
280
if (meth & 0x80) {
243
lz_unpack(pb, s->unpack_buffer, s->unpack_buffer_size);
281
lz_unpack(pb, pb_size,
282
s->unpack_buffer, s->unpack_buffer_size);
245
284
pb = s->unpack_buffer;
285
pb_size = s->unpack_buffer_size;
248
288
dp = &s->frame.data[0][frame_y * s->frame.linesize[0] + frame_x];
252
292
for (i = 0; i < frame_height; i++) {
256
299
if (len & 0x80) {
257
300
len = (len & 0x7F) + 1;
258
if (ofs + len > frame_width)
301
if (ofs + len > frame_width || pb_size < len)
260
303
memcpy(&dp[ofs], pb, len);
264
308
/* interframe pixel copy */
265
if (ofs + len + 1 > frame_width)
309
if (ofs + len + 1 > frame_width || !s->prev_frame.data[0])
267
311
memcpy(&dp[ofs], &pp[ofs], len + 1);
291
338
for (i = 0; i < frame_height; i++) {
295
345
if (len & 0x80) {
296
346
len = (len & 0x7F) + 1;
297
349
if (*pb++ == 0xFF)
298
len = rle_unpack(pb, &dp[ofs], len, frame_width - ofs);
350
len = rle_unpack(pb, &dp[ofs], len, pb_size, frame_width - ofs);
300
354
memcpy(&dp[ofs], pb, len);
304
360
/* interframe pixel copy */
305
if (ofs + len + 1 > frame_width)
361
if (ofs + len + 1 > frame_width || !s->prev_frame.data[0])
307
363
memcpy(&dp[ofs], &pp[ofs], len + 1);
443
499
VmdAudioContext *s = avctx->priv_data;
501
if (avctx->channels < 1 || avctx->channels > 2) {
502
av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
503
return AVERROR(EINVAL);
505
if (avctx->block_align < 1) {
506
av_log(avctx, AV_LOG_ERROR, "invalid block align\n");
507
return AVERROR(EINVAL);
446
510
if (avctx->bits_per_coded_sample == 16)
447
511
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
449
513
avctx->sample_fmt = AV_SAMPLE_FMT_U8;
450
514
s->out_bps = av_get_bytes_per_sample(avctx->sample_fmt);
516
s->chunk_size = avctx->block_align + avctx->channels * (s->out_bps == 2);
518
avcodec_get_frame_defaults(&s->frame);
519
avctx->coded_frame = &s->frame;
452
521
av_log(avctx, AV_LOG_DEBUG, "%d channels, %d bits/sample, "
453
522
"block align = %d, sample rate = %d\n",
454
523
avctx->channels, avctx->bits_per_coded_sample, avctx->block_align,
460
static void vmdaudio_decode_audio(VmdAudioContext *s, unsigned char *data,
461
const uint8_t *buf, int buf_size, int stereo)
529
static void decode_audio_s16(int16_t *out, const uint8_t *buf, int buf_size,
465
int16_t *out = (int16_t*)data;
467
for(i = 0; i < buf_size; i++) {
469
s->predictors[chan] -= vmdaudio_table[buf[i] & 0x7F];
533
const uint8_t *buf_end = buf + buf_size;
535
int st = channels - 1;
537
/* decode initial raw sample */
538
for (ch = 0; ch < channels; ch++) {
539
predictor[ch] = (int16_t)AV_RL16(buf);
541
*out++ = predictor[ch];
544
/* decode DPCM samples */
546
while (buf < buf_end) {
549
predictor[ch] -= vmdaudio_table[b & 0x7F];
471
s->predictors[chan] += vmdaudio_table[buf[i]];
472
s->predictors[chan] = av_clip_int16(s->predictors[chan]);
473
out[i] = s->predictors[chan];
478
static int vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data,
479
const uint8_t *buf, int silent_chunks, int data_size)
481
int silent_size = s->avctx->block_align * silent_chunks * s->out_bps;
484
memset(data, s->out_bps == 2 ? 0x00 : 0x80, silent_size);
487
if (s->avctx->bits_per_coded_sample == 16)
488
vmdaudio_decode_audio(s, data, buf, data_size, s->avctx->channels == 2);
490
/* just copy the data */
491
memcpy(data, buf, data_size);
494
return silent_size + data_size * s->out_bps;
497
static int vmdaudio_decode_frame(AVCodecContext *avctx,
498
void *data, int *data_size,
551
predictor[ch] += vmdaudio_table[b];
552
predictor[ch] = av_clip_int16(predictor[ch]);
553
*out++ = predictor[ch];
558
static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data,
559
int *got_frame_ptr, AVPacket *avpkt)
501
561
const uint8_t *buf = avpkt->data;
562
const uint8_t *buf_end;
502
563
int buf_size = avpkt->size;
503
564
VmdAudioContext *s = avctx->priv_data;
504
int block_type, silent_chunks;
505
unsigned char *output_samples = (unsigned char *)data;
565
int block_type, silent_chunks, audio_chunks;
567
uint8_t *output_samples_u8;
568
int16_t *output_samples_s16;
507
570
if (buf_size < 16) {
508
571
av_log(avctx, AV_LOG_WARNING, "skipping small junk packet\n");
584
/* get number of silent chunks */
521
585
silent_chunks = 0;
522
586
if (block_type == BLOCK_TYPE_INITIAL) {
523
uint32_t flags = AV_RB32(buf);
524
silent_chunks = av_popcount(flags);
589
av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
590
return AVERROR(EINVAL);
592
flags = AV_RB32(buf);
593
silent_chunks = av_popcount(flags);
527
596
} else if (block_type == BLOCK_TYPE_SILENCE) {
532
601
/* ensure output buffer is large enough */
533
if (*data_size < (avctx->block_align*silent_chunks + buf_size) * s->out_bps)
536
*data_size = vmdaudio_loadsound(s, output_samples, buf, silent_chunks, buf_size);
602
audio_chunks = buf_size / s->chunk_size;
604
/* get output buffer */
605
s->frame.nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) / avctx->channels;
606
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
607
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
610
output_samples_u8 = s->frame.data[0];
611
output_samples_s16 = (int16_t *)s->frame.data[0];
613
/* decode silent chunks */
614
if (silent_chunks > 0) {
615
int silent_size = avctx->block_align * silent_chunks;
616
if (s->out_bps == 2) {
617
memset(output_samples_s16, 0x00, silent_size * 2);
618
output_samples_s16 += silent_size;
620
memset(output_samples_u8, 0x80, silent_size);
621
output_samples_u8 += silent_size;
625
/* decode audio chunks */
626
if (audio_chunks > 0) {
627
buf_end = buf + buf_size;
628
while (buf < buf_end) {
629
if (s->out_bps == 2) {
630
decode_audio_s16(output_samples_s16, buf, s->chunk_size,
632
output_samples_s16 += avctx->block_align;
634
memcpy(output_samples_u8, buf, s->chunk_size);
635
output_samples_u8 += avctx->block_align;
637
buf += s->chunk_size;
642
*(AVFrame *)data = s->frame;
538
644
return avpkt->size;
546
652
AVCodec ff_vmdvideo_decoder = {
550
sizeof(VmdVideoContext),
551
vmdvideo_decode_init,
554
vmdvideo_decode_frame,
654
.type = AVMEDIA_TYPE_VIDEO,
655
.id = CODEC_ID_VMDVIDEO,
656
.priv_data_size = sizeof(VmdVideoContext),
657
.init = vmdvideo_decode_init,
658
.close = vmdvideo_decode_end,
659
.decode = vmdvideo_decode_frame,
660
.capabilities = CODEC_CAP_DR1,
556
661
.long_name = NULL_IF_CONFIG_SMALL("Sierra VMD video"),
559
664
AVCodec ff_vmdaudio_decoder = {
563
sizeof(VmdAudioContext),
564
vmdaudio_decode_init,
567
vmdaudio_decode_frame,
666
.type = AVMEDIA_TYPE_AUDIO,
667
.id = CODEC_ID_VMDAUDIO,
668
.priv_data_size = sizeof(VmdAudioContext),
669
.init = vmdaudio_decode_init,
670
.decode = vmdaudio_decode_frame,
671
.capabilities = CODEC_CAP_DR1,
568
672
.long_name = NULL_IF_CONFIG_SMALL("Sierra VMD audio"),