[FFmpeg-devel] [PATCH 2/2] libschroedingerdec: fix leaking of framewithpts
Andreas Cadhalpun
andreas.cadhalpun at googlemail.com
Mon Nov 14 00:25:32 EET 2016
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
---
libavcodec/libschroedingerdec.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/libavcodec/libschroedingerdec.c b/libavcodec/libschroedingerdec.c
index 1e392b3..83c790c 100644
--- a/libavcodec/libschroedingerdec.c
+++ b/libavcodec/libschroedingerdec.c
@@ -218,6 +218,7 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
int outer = 1;
SchroParseUnitContext parse_ctx;
LibSchroFrameContext *framewithpts = NULL;
+ int ret;
*got_frame = 0;
@@ -236,7 +237,8 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
enc_buf->tag = schro_tag_new(av_malloc(sizeof(int64_t)), av_free);
if (!enc_buf->tag->value) {
av_log(avctx, AV_LOG_ERROR, "Unable to allocate SchroTag\n");
- return AVERROR(ENOMEM);
+ ret = AVERROR(ENOMEM);
+ goto end;
}
AV_WN(64, enc_buf->tag->value, pts);
/* Push buffer into decoder. */
@@ -267,8 +269,10 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
/* Decoder needs a frame - create one and push it in. */
frame = ff_create_schro_frame(avctx,
p_schro_params->frame_format);
- if (!frame)
- return AVERROR(ENOMEM);
+ if (!frame) {
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
schro_decoder_add_output_picture(decoder, frame);
break;
@@ -282,7 +286,8 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
framewithpts = av_malloc(sizeof(LibSchroFrameContext));
if (!framewithpts) {
av_log(avctx, AV_LOG_ERROR, "Unable to allocate FrameWithPts\n");
- return AVERROR(ENOMEM);
+ ret = AVERROR(ENOMEM);
+ goto end;
}
framewithpts->frame = frame;
framewithpts->pts = AV_RN64(tag->value);
@@ -298,7 +303,8 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
break;
case SCHRO_DECODER_ERROR:
- return -1;
+ ret = -1;
+ goto end;
break;
}
}
@@ -308,10 +314,9 @@ static int libschroedinger_decode_frame(AVCodecContext *avctx,
framewithpts = ff_schro_queue_pop(&p_schro_params->dec_frame_queue);
if (framewithpts && framewithpts->frame && framewithpts->frame->components[0].stride) {
- int ret;
- if ((ret = ff_get_buffer(avctx, avframe, 0)) < 0)
- return ret;
+ if ((ret = ff_get_buffer(avctx, avframe, 0)) < 0) {}
+ goto end;
memcpy(avframe->data[0],
framewithpts->frame->components[0].data,
@@ -345,7 +350,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
data = NULL;
*got_frame = 0;
}
- return buf_size;
+ ret = buf_size;
+end:
+ av_freep(&framewithpts);
+ return ret;
}
--
2.10.2
More information about the ffmpeg-devel
mailing list