[FFmpeg-cvslog] avcodec/mwsc: Use ff_inflate_init/end()
Andreas Rheinhardt
git at videolan.org
Sat Mar 19 02:30:30 EET 2022
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Tue Mar 15 12:13:19 2022 +0100| [c1b0b8f9beec02e616366376f540d7ea3f941347] | committer: Andreas Rheinhardt
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 at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c1b0b8f9beec02e616366376f540d7ea3f941347
---
configure | 2 +-
libavcodec/mwsc.c | 32 ++++++++++++--------------------
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;
}
More information about the ffmpeg-cvslog
mailing list