* [FFmpeg-devel] [PATCH] doc/examples/hw_decode: Add proper deallocations to avoid potential memory leaks
@ 2025-08-06 16:21 Jiasheng Jiang
0 siblings, 0 replies; only message in thread
From: Jiasheng Jiang @ 2025-08-06 16:21 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Jiasheng Jiang
Add proper deallocations in the error paths to avoid potential memory leaks.
Fixes: 1e0c75ea16 ("examples/hw_decode: Add a HWAccel decoding example.")
Signed-off-by: Jiasheng Jiang <jiashengjiangcool@gmail.com>
---
doc/examples/hw_decode.c | 48 +++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 15 deletions(-)
diff --git a/doc/examples/hw_decode.c b/doc/examples/hw_decode.c
index ac4e445505..4324b1f18d 100644
--- a/doc/examples/hw_decode.c
+++ b/doc/examples/hw_decode.c
@@ -181,19 +181,22 @@ int main(int argc, char *argv[])
/* open the input file */
if (avformat_open_input(&input_ctx, argv[2], NULL, NULL) != 0) {
fprintf(stderr, "Cannot open input file '%s'\n", argv[2]);
- return -1;
+ ret = -1;
+ goto free_packet;
}
if (avformat_find_stream_info(input_ctx, NULL) < 0) {
fprintf(stderr, "Cannot find input stream information.\n");
- return -1;
+ ret = -1;
+ goto close_input;
}
/* find the video stream information */
ret = av_find_best_stream(input_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &decoder, 0);
if (ret < 0) {
fprintf(stderr, "Cannot find a video stream in the input file\n");
- return -1;
+ ret = -1;
+ goto close_input;
}
video_stream = ret;
@@ -202,7 +205,8 @@ int main(int argc, char *argv[])
if (!config) {
fprintf(stderr, "Decoder %s does not support device type %s.\n",
decoder->name, av_hwdevice_get_type_name(type));
- return -1;
+ ret = -1;
+ goto close_input;
}
if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX &&
config->device_type == type) {
@@ -211,21 +215,28 @@ int main(int argc, char *argv[])
}
}
- if (!(decoder_ctx = avcodec_alloc_context3(decoder)))
- return AVERROR(ENOMEM);
+ if (!(decoder_ctx = avcodec_alloc_context3(decoder))) {
+ ret = AVERROR(ENOMEM);
+ goto close_input;
+ }
video = input_ctx->streams[video_stream];
- if (avcodec_parameters_to_context(decoder_ctx, video->codecpar) < 0)
- return -1;
+ if (avcodec_parameters_to_context(decoder_ctx, video->codecpar) < 0) {
+ ret = -1;
+ goto free_decoder_ctx;
+ }
decoder_ctx->get_format = get_hw_format;
- if (hw_decoder_init(decoder_ctx, type) < 0)
- return -1;
+ if (hw_decoder_init(decoder_ctx, type) < 0) {
+ ret -1;
+ goto free_decoder_ctx;
+ }
if ((ret = avcodec_open2(decoder_ctx, decoder, NULL)) < 0) {
fprintf(stderr, "Failed to open codec for stream #%u\n", video_stream);
- return -1;
+ ret = -1;
+ goto av_frame_unref;
}
/* open the file to dump raw data */
@@ -243,14 +254,21 @@ int main(int argc, char *argv[])
}
/* flush the decoder */
- ret = decode_write(decoder_ctx, NULL);
+ decode_write(decoder_ctx, NULL);
if (output_file)
fclose(output_file);
- av_packet_free(&packet);
+
+ ret = 0;
+
+av_frame_unref:
+ av_buffer_unref(&hw_device_ctx);
+free_decoder_ctx:
avcodec_free_context(&decoder_ctx);
+close_input:
avformat_close_input(&input_ctx);
- av_buffer_unref(&hw_device_ctx);
+free_packet:
+ av_packet_free(&packet);
- return 0;
+ return ret;
}
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-08-06 16:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-06 16:21 [FFmpeg-devel] [PATCH] doc/examples/hw_decode: Add proper deallocations to avoid potential memory leaks Jiasheng Jiang
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git