Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-08-04 23:21:41 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-08-04 23:21:46 +0400
commitf85746509ca8b727d97ff801a63a22f81fd27a0c (patch)
treee9c655fc06a82cb49b94fb500b453261efe7b846
parent82de3e16a8aac7607a1e37f0ad61a5a51238e2ac (diff)
parentfcf550c2cbc35c1c4d90f8d23bb3340ebc31ce46 (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.c36
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);