aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-03-15 12:13:19 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-03-19 00:18:35 +0100
commitc1b0b8f9beec02e616366376f540d7ea3f941347 (patch)
tree44a43cc03a8b8120520807a53e4aa5271499d175
parentac692aa8e9e3846417aa7eceebec223aa2215cf3 (diff)
downloadffmpeg-c1b0b8f9beec02e616366376f540d7ea3f941347.tar.gz
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>
-rwxr-xr-xconfigure2
-rw-r--r--libavcodec/mwsc.c32
2 files changed, 13 insertions, 21 deletions
diff --git a/configure b/configure
index 91395d1f6b..8c89c96de0 100755
--- a/configure
+++ b/configure
@@ -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"
diff --git a/libavcodec/mwsc.c b/libavcodec/mwsc.c
index b62db67ff5..0ae99f6655 100644
--- a/libavcodec/mwsc.c
+++ b/libavcodec/mwsc.c
@@ -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;
}