[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