* dwbuiten/master: zerocodec: Fix memleak in decode_frame zerocodec: Cosmetics
Unified · Split
| @@ -23,7 +23,7 @@ · 22 unmodified lines | |||
| 23 | typedef struct { | 23 | typedef struct { |
| 24 | AVFrame previous_frame; | 24 | AVFrame previous_frame; |
| 25 | z_stream zstream; | 25 | z_stream zstream; |
| 26 | int size; | 26 | int size; |
| 27 | } ZeroCodecContext; | 27 | } ZeroCodecContext; |
| 28 | 28 | ||
| 29 | static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, | 29 | static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, |
| @@ -33,7 +33,8 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, · 3 unmodified lines | |||
| 33 | AVFrame *pic = avctx->coded_frame; | 33 | AVFrame *pic = avctx->coded_frame; |
| 34 | AVFrame *prev_pic = &zc->previous_frame; | 34 | AVFrame *prev_pic = &zc->previous_frame; |
| 35 | z_stream *zstream = &zc->zstream; | 35 | z_stream *zstream = &zc->zstream; |
| 36 | uint8_t *prev = prev_pic->data[0], *dst; | 36 | uint8_t *prev = prev_pic->data[0]; |
| 37 | uint8_t *dst; | ||
| 37 | int i, j, zret; | 38 | int i, j, zret; |
| 38 | 39 | ||
| 39 | pic->reference = 3; | 40 | pic->reference = 3; |
| @@ -43,29 +44,28 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, · 3 unmodified lines | |||
| 43 | pic->pict_type = AV_PICTURE_TYPE_I; | 44 | pic->pict_type = AV_PICTURE_TYPE_I; |
| 44 | } else { | 45 | } else { |
| 45 | if (!prev) { | 46 | if (!prev) { |
| 46 | av_log(avctx, AV_LOG_ERROR, "Missing reference frame!\n"); | 47 | av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n"); |
| 47 | return AVERROR_INVALIDDATA; | 48 | return AVERROR_INVALIDDATA; |
| 48 | } | 49 | } |
| 49 | pic->key_frame = 0; | 50 | pic->key_frame = 0; |
| 50 | pic->pict_type = AV_PICTURE_TYPE_P; | 51 | pic->pict_type = AV_PICTURE_TYPE_P; |
| 51 | } | 52 | } |
| 52 | 53 | ||
| 54 | zret = inflateReset(zstream); | ||
| 55 | if (zret != Z_OK) { | ||
| 56 | av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d.\n", zret); | ||
| 57 | return AVERROR_INVALIDDATA; | ||
| 58 | } | ||
| 59 | |||
| 53 | if (avctx->get_buffer(avctx, pic) < 0) { | 60 | if (avctx->get_buffer(avctx, pic) < 0) { |
| 54 | av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); | 61 | av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); |
| 55 | return AVERROR(ENOMEM); | 62 | return AVERROR(ENOMEM); |
| 56 | } | 63 | } |
| 57 | 64 | ||
| 58 | zret = inflateReset(zstream); | 65 | zstream->next_in = avpkt->data; |
| 66 | zstream->avail_in = avpkt->size; | ||
| 59 | 67 | ||
| 60 | if (zret != Z_OK) { | 68 | dst = pic->data[0]; |
| 61 | av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d\n", zret); | ||
| 62 | return AVERROR(EINVAL); | ||
| 63 | } | ||
| 64 | |||
| 65 | zstream->next_in = avpkt->data; | ||
| 66 | zstream->avail_in = avpkt->size; | ||
| 67 | |||
| 68 | dst = pic->data[0]; | ||
| 69 | 69 | ||
| 70 | /** | 70 | /** |
| 71 | * ZeroCodec has very simple interframe compression. If a value | 71 | * ZeroCodec has very simple interframe compression. If a value |
| @@ -75,11 +75,13 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, · 3 unmodified lines | |||
| 75 | for (i = 0; i < avctx->height; i++) { | 75 | for (i = 0; i < avctx->height; i++) { |
| 76 | zstream->next_out = dst; | 76 | zstream->next_out = dst; |
| 77 | zstream->avail_out = avctx->width << 1; | 77 | zstream->avail_out = avctx->width << 1; |
| 78 | |||
| 78 | zret = inflate(zstream, Z_SYNC_FLUSH); | 79 | zret = inflate(zstream, Z_SYNC_FLUSH); |
| 79 | if (zret != Z_OK && zret != Z_STREAM_END) { | 80 | if (zret != Z_OK && zret != Z_STREAM_END) { |
| 81 | avctx->release_buffer(avctx, pic); | ||
| 80 | av_log(avctx, AV_LOG_ERROR, | 82 | av_log(avctx, AV_LOG_ERROR, |
| 81 | "Inflate failed with return code: %d\n", zret); | 83 | "Inflate failed with return code: %d.\n", zret); |
| 82 | return AVERROR(EINVAL); | 84 | return AVERROR_INVALIDDATA; |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | if (!(avpkt->flags & AV_PKT_FLAG_KEY)) | 87 | if (!(avpkt->flags & AV_PKT_FLAG_KEY)) |
| @@ -137,14 +139,12 @@ static av_cold int zerocodec_decode_init(AVCodecContext *avctx) · 51 unmodified lines | |||
| 137 | zstream->opaque = Z_NULL; | 139 | zstream->opaque = Z_NULL; |
| 138 | 140 | ||
| 139 | zret = inflateInit(zstream); | 141 | zret = inflateInit(zstream); |
| 140 | |||
| 141 | if (zret != Z_OK) { | 142 | if (zret != Z_OK) { |
| 142 | av_log(avctx, AV_LOG_ERROR, "Could not initialize inflate: %d\n", zret); | 143 | av_log(avctx, AV_LOG_ERROR, "Could not initialize inflate: %d.\n", zret); |
| 143 | return AVERROR(ENOMEM); | 144 | return AVERROR(ENOMEM); |
| 144 | } | 145 | } |
| 145 | 146 | ||
| 146 | avctx->coded_frame = avcodec_alloc_frame(); | 147 | avctx->coded_frame = avcodec_alloc_frame(); |
| 147 | |||
| 148 | if (!avctx->coded_frame) { | 148 | if (!avctx->coded_frame) { |
| 149 | av_log(avctx, AV_LOG_ERROR, "Could not allocate frame buffer.\n"); | 149 | av_log(avctx, AV_LOG_ERROR, "Could not allocate frame buffer.\n"); |
| 150 | zerocodec_decode_close(avctx); | 150 | zerocodec_decode_close(avctx); |