Commit 31980b6a authored by Kostya Shishkov's avatar Kostya Shishkov

vmd: decode videos with no LZ buffer size provided - they might not need it

The buffer is used for an additional pass of frame compression, so videos
can be coded without ever using it (and some are coded so indeed, e.g. in
Woodruff and the Schnibble of Azimuth game).
parent 0aed0bfc
...@@ -278,6 +278,11 @@ static int vmd_decode(VmdVideoContext *s, AVFrame *frame) ...@@ -278,6 +278,11 @@ static int vmd_decode(VmdVideoContext *s, AVFrame *frame)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
meth = bytestream2_get_byteu(&gb); meth = bytestream2_get_byteu(&gb);
if (meth & 0x80) { if (meth & 0x80) {
if (!s->unpack_buffer_size) {
av_log(s->avctx, AV_LOG_ERROR,
"Trying to unpack LZ-compressed frame with no LZ buffer\n");
return AVERROR_INVALIDDATA;
}
lz_unpack(gb.buffer, bytestream2_get_bytes_left(&gb), lz_unpack(gb.buffer, bytestream2_get_bytes_left(&gb),
s->unpack_buffer, s->unpack_buffer_size); s->unpack_buffer, s->unpack_buffer_size);
meth &= 0x7F; meth &= 0x7F;
...@@ -389,9 +394,11 @@ static av_cold int vmdvideo_decode_init(AVCodecContext *avctx) ...@@ -389,9 +394,11 @@ static av_cold int vmdvideo_decode_init(AVCodecContext *avctx)
vmd_header = (unsigned char *)avctx->extradata; vmd_header = (unsigned char *)avctx->extradata;
s->unpack_buffer_size = AV_RL32(&vmd_header[800]); s->unpack_buffer_size = AV_RL32(&vmd_header[800]);
if (s->unpack_buffer_size) {
s->unpack_buffer = av_malloc(s->unpack_buffer_size); s->unpack_buffer = av_malloc(s->unpack_buffer_size);
if (!s->unpack_buffer) if (!s->unpack_buffer)
return -1; return AVERROR(ENOMEM);
}
/* load up the initial palette */ /* load up the initial palette */
raw_palette = &vmd_header[28]; raw_palette = &vmd_header[28];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment