avcodec/mwsc: Use ff_inflate_init/end()

This fixes the problem of potentially closing a z_stream
that has never been successfully initialized.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2022-03-15 12:13:19 +01:00
parent ac692aa8e9
commit c1b0b8f9be
2 changed files with 13 additions and 21 deletions

2
configure vendored
View File

@ -2894,7 +2894,7 @@ mts2_decoder_select="jpegtables mss34dsp"
mv30_decoder_select="aandcttables blockdsp"
mvha_decoder_deps="zlib"
mvha_decoder_select="llviddsp"
mwsc_decoder_deps="zlib"
mwsc_decoder_select="inflate_wrapper"
mxpeg_decoder_select="mjpeg_decoder"
nellymoser_decoder_select="mdct sinewin"
nellymoser_encoder_select="audio_frame_queue mdct sinewin"

View File

@ -27,14 +27,15 @@
#include "avcodec.h"
#include "bytestream.h"
#include "internal.h"
#include "zlib_wrapper.h"
#include <zlib.h>
typedef struct MWSCContext {
unsigned int decomp_size;
uint8_t *decomp_buf;
z_stream zstream;
AVFrame *prev_frame;
FFZStream zstream;
} MWSCContext;
static int rle_uncompress(GetByteContext *gb, PutByteContext *pb, GetByteContext *gbp,
@ -90,6 +91,7 @@ static int decode_frame(AVCodecContext *avctx,
AVPacket *avpkt)
{
MWSCContext *s = avctx->priv_data;
z_stream *const zstream = &s->zstream.zstream;
AVFrame *frame = data;
uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
@ -98,16 +100,16 @@ static int decode_frame(AVCodecContext *avctx,
PutByteContext pb;
int ret;
ret = inflateReset(&s->zstream);
ret = inflateReset(zstream);
if (ret != Z_OK) {
av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", ret);
return AVERROR_EXTERNAL;
}
s->zstream.next_in = buf;
s->zstream.avail_in = buf_size;
s->zstream.next_out = s->decomp_buf;
s->zstream.avail_out = s->decomp_size;
ret = inflate(&s->zstream, Z_FINISH);
zstream->next_in = buf;
zstream->avail_in = buf_size;
zstream->next_out = s->decomp_buf;
zstream->avail_out = s->decomp_size;
ret = inflate(zstream, Z_FINISH);
if (ret != Z_STREAM_END) {
av_log(avctx, AV_LOG_ERROR, "Inflate error: %d\n", ret);
return AVERROR_EXTERNAL;
@ -116,7 +118,7 @@ static int decode_frame(AVCodecContext *avctx,
if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
return ret;
bytestream2_init(&gb, s->decomp_buf, s->zstream.total_out);
bytestream2_init(&gb, s->decomp_buf, zstream->total_out);
bytestream2_init(&gbp, s->prev_frame->data[0], avctx->height * s->prev_frame->linesize[0]);
bytestream2_init_writer(&pb, frame->data[0], avctx->height * frame->linesize[0]);
@ -138,7 +140,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
{
MWSCContext *s = avctx->priv_data;
int64_t size;
int zret;
avctx->pix_fmt = AV_PIX_FMT_BGR24;
@ -149,20 +150,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
if (!(s->decomp_buf = av_malloc(s->decomp_size)))
return AVERROR(ENOMEM);
s->zstream.zalloc = Z_NULL;
s->zstream.zfree = Z_NULL;
s->zstream.opaque = Z_NULL;
zret = inflateInit(&s->zstream);
if (zret != Z_OK) {
av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
return AVERROR_EXTERNAL;
}
s->prev_frame = av_frame_alloc();
if (!s->prev_frame)
return AVERROR(ENOMEM);
return 0;
return ff_inflate_init(&s->zstream, avctx);
}
static av_cold int decode_close(AVCodecContext *avctx)
@ -172,7 +164,7 @@ static av_cold int decode_close(AVCodecContext *avctx)
av_frame_free(&s->prev_frame);
av_freep(&s->decomp_buf);
s->decomp_size = 0;
inflateEnd(&s->zstream);
ff_inflate_end(&s->zstream);
return 0;
}