From a554adaab83f91685edd89f91d7373c1dc60709c Mon Sep 17 00:00:00 2001 From: Limin Wang Date: Thu, 17 Sep 2020 21:54:28 +0800 Subject: [PATCH] avdevice/lavfi: unref the frame on failure Reviewed-by: Nicolas George Signed-off-by: Limin Wang --- libavdevice/lavfi.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c index 268dc0d2a22..a4b510ff975 100644 --- a/libavdevice/lavfi.c +++ b/libavdevice/lavfi.c @@ -432,7 +432,7 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt) if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { size = av_image_get_buffer_size(frame->format, frame->width, frame->height, 1); if ((ret = av_new_packet(pkt, size)) < 0) - return ret; + goto fail; av_image_copy_to_buffer(pkt->data, size, (const uint8_t **)frame->data, frame->linesize, frame->format, frame->width, frame->height, 1); @@ -440,7 +440,7 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt) size = frame->nb_samples * av_get_bytes_per_sample(frame->format) * frame->channels; if ((ret = av_new_packet(pkt, size)) < 0) - return ret; + goto fail;; memcpy(pkt->data, frame->data[0], size); } @@ -449,18 +449,19 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt) int size; uint8_t *metadata = av_packet_pack_dictionary(frame_metadata, &size); - if (!metadata) - return AVERROR(ENOMEM); + if (!metadata) { + ret = AVERROR(ENOMEM); + goto fail; + } if ((ret = av_packet_add_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, metadata, size)) < 0) { av_freep(&metadata); - return ret; + goto fail;; } } if ((ret = create_subcc_packet(avctx, frame, min_pts_sink_idx)) < 0) { - av_frame_unref(frame); - return ret; + goto fail; } pkt->stream_index = stream_idx; @@ -468,6 +469,10 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt) pkt->pos = frame->pkt_pos; av_frame_unref(frame); return size; +fail: + av_frame_unref(frame); + return ret; + } #define OFFSET(x) offsetof(LavfiContext, x) -- 2.39.2