diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-08-04 23:21:41 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-08-04 23:21:46 +0400 |
commit | f85746509ca8b727d97ff801a63a22f81fd27a0c (patch) | |
tree | e9c655fc06a82cb49b94fb500b453261efe7b846 | |
parent | 82de3e16a8aac7607a1e37f0ad61a5a51238e2ac (diff) | |
parent | fcf550c2cbc35c1c4d90f8d23bb3340ebc31ce46 (diff) |
Merge remote-tracking branch 'dwbuiten/master'
* dwbuiten/master:
zerocodec: Fix memleak in decode_frame
zerocodec: Cosmetics
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/zerocodec.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c index 6581706765..cfbd16f147 100644 --- a/libavcodec/zerocodec.c +++ b/libavcodec/zerocodec.c @@ -23,7 +23,7 @@ typedef struct { AVFrame previous_frame; z_stream zstream; - int size; + int size; } ZeroCodecContext; static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, @@ -33,7 +33,8 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, AVFrame *pic = avctx->coded_frame; AVFrame *prev_pic = &zc->previous_frame; z_stream *zstream = &zc->zstream; - uint8_t *prev = prev_pic->data[0], *dst; + uint8_t *prev = prev_pic->data[0]; + uint8_t *dst; int i, j, zret; pic->reference = 3; @@ -43,29 +44,28 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, pic->pict_type = AV_PICTURE_TYPE_I; } else { if (!prev) { - av_log(avctx, AV_LOG_ERROR, "Missing reference frame!\n"); + av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n"); return AVERROR_INVALIDDATA; } pic->key_frame = 0; pic->pict_type = AV_PICTURE_TYPE_P; } + zret = inflateReset(zstream); + if (zret != Z_OK) { + av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d.\n", zret); + return AVERROR_INVALIDDATA; + } + if (avctx->get_buffer(avctx, pic) < 0) { av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); return AVERROR(ENOMEM); } - zret = inflateReset(zstream); + zstream->next_in = avpkt->data; + zstream->avail_in = avpkt->size; - if (zret != Z_OK) { - av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d\n", zret); - return AVERROR(EINVAL); - } - - zstream->next_in = avpkt->data; - zstream->avail_in = avpkt->size; - - dst = pic->data[0]; + dst = pic->data[0]; /** * ZeroCodec has very simple interframe compression. If a value @@ -75,11 +75,13 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, for (i = 0; i < avctx->height; i++) { zstream->next_out = dst; zstream->avail_out = avctx->width << 1; + zret = inflate(zstream, Z_SYNC_FLUSH); if (zret != Z_OK && zret != Z_STREAM_END) { + avctx->release_buffer(avctx, pic); av_log(avctx, AV_LOG_ERROR, - "Inflate failed with return code: %d\n", zret); - return AVERROR(EINVAL); + "Inflate failed with return code: %d.\n", zret); + return AVERROR_INVALIDDATA; } if (!(avpkt->flags & AV_PKT_FLAG_KEY)) @@ -137,14 +139,12 @@ static av_cold int zerocodec_decode_init(AVCodecContext *avctx) zstream->opaque = Z_NULL; zret = inflateInit(zstream); - if (zret != Z_OK) { - av_log(avctx, AV_LOG_ERROR, "Could not initialize inflate: %d\n", zret); + av_log(avctx, AV_LOG_ERROR, "Could not initialize inflate: %d.\n", zret); return AVERROR(ENOMEM); } avctx->coded_frame = avcodec_alloc_frame(); - if (!avctx->coded_frame) { av_log(avctx, AV_LOG_ERROR, "Could not allocate frame buffer.\n"); zerocodec_decode_close(avctx); |