[FFmpeg-devel] [PATCH] avcodec/pngdec: init zlib on decoder init.

Benoit Fouet benoit.fouet at free.fr
Thu Nov 20 09:43:56 CET 2014


---
 libavcodec/pngdec.c | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 57b73c1..e3d61f6 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -411,11 +411,6 @@ static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
     unsigned buf_size;
     int ret;
 
-    zstream.zalloc = ff_png_zalloc;
-    zstream.zfree  = ff_png_zfree;
-    zstream.opaque = NULL;
-    if (inflateInit(&zstream) != Z_OK)
-        return AVERROR_EXTERNAL;
     zstream.next_in  = (unsigned char *)data;
     zstream.avail_in = data_end - data;
     av_bprint_init(bp, 0, -1);
@@ -437,12 +432,10 @@ static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
         if (ret == Z_STREAM_END)
             break;
     }
-    inflateEnd(&zstream);
     bp->str[bp->len] = 0;
     return 0;
 
 fail:
-    inflateEnd(&zstream);
     av_bprint_finalize(bp, NULL);
     return ret;
 }
@@ -924,16 +917,6 @@ static int decode_frame_png(AVCodecContext *avctx,
 
     s->y = s->state = 0;
 
-    /* init the zlib */
-    s->zstream.zalloc = ff_png_zalloc;
-    s->zstream.zfree  = ff_png_zfree;
-    s->zstream.opaque = NULL;
-    ret = inflateInit(&s->zstream);
-    if (ret != Z_OK) {
-        av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
-        return AVERROR_EXTERNAL;
-    }
-
     if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
         goto the_end;
 
@@ -944,7 +927,6 @@ static int decode_frame_png(AVCodecContext *avctx,
 
     ret = bytestream2_tell(&s->gb);
 the_end:
-    inflateEnd(&s->zstream);
     s->crow_buf = NULL;
     return ret;
 }
@@ -967,6 +949,7 @@ static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 static av_cold int png_dec_init(AVCodecContext *avctx)
 {
     PNGDecContext *s = avctx->priv_data;
+    int ret;
 
     s->avctx = avctx;
     s->last_picture.f = av_frame_alloc();
@@ -979,6 +962,16 @@ static av_cold int png_dec_init(AVCodecContext *avctx)
         ff_pngdsp_init(&s->dsp);
     }
 
+    /* init the zlib */
+    s->zstream.zalloc = ff_png_zalloc;
+    s->zstream.zfree  = ff_png_zfree;
+    s->zstream.opaque = NULL;
+    ret = inflateInit(&s->zstream);
+    if (ret != Z_OK) {
+        av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
+        return AVERROR_EXTERNAL;
+    }
+
     return 0;
 }
 
@@ -996,6 +989,7 @@ static av_cold int png_dec_end(AVCodecContext *avctx)
     s->last_row_size = 0;
     av_freep(&s->tmp_row);
     s->tmp_row_size = 0;
+    inflateEnd(&s->zstream);
 
     return 0;
 }
-- 
2.2.0.rc1.23.gf570943



More information about the ffmpeg-devel mailing list