From 083c8d4404df034a06f9f919d8dc9f2e5b7bcea8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 6 Jan 2026 07:15:59 +0000 Subject: [PATCH] Fix segmentation fault in filter graph output loop Co-authored-by: PioLing <24726315+PioLing@users.noreply.github.com> --- src/Codec/Transcode.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Codec/Transcode.cpp b/src/Codec/Transcode.cpp index 9f5d1125..5d575be5 100644 --- a/src/Codec/Transcode.cpp +++ b/src/Codec/Transcode.cpp @@ -34,6 +34,10 @@ std::unique_ptr alloc_av_packet() { return std::unique_ptr(av_packet_alloc(), [](AVPacket *pkt) { av_packet_free(&pkt); }); } +std::unique_ptr alloc_av_frame() { + return std::unique_ptr(av_frame_alloc(), [](AVFrame *frame) { av_frame_free(&frame); }); +} + ////////////////////////////////////////////////////////////////////////////////////////// static void on_ffmpeg_log(void *ctx, int level, const char *fmt, va_list args) { GET_CONFIG(bool, enable_ffmpeg_log, General::kEnableFFmpegLog); @@ -875,12 +879,14 @@ std::tuple FFmpegUtils::saveFrame(const FFmpegFrame::Ptr &fra } auto pkt = alloc_av_packet(); - while (av_buffersink_get_frame(buffersink_ctx, new_frame->get()) >= 0) { - if (avcodec_send_frame(jpeg_codec_ctx.get(), new_frame->get()) == 0) { + auto filt_frame = alloc_av_frame(); + while (av_buffersink_get_frame(buffersink_ctx, filt_frame.get()) >= 0) { + if (avcodec_send_frame(jpeg_codec_ctx.get(), filt_frame.get()) == 0) { while (avcodec_receive_packet(jpeg_codec_ctx.get(), pkt.get()) == 0) { fwrite(pkt.get()->data, pkt.get()->size, 1, tmp_save_file_jpg.get()); } } + av_frame_unref(filt_frame.get()); } return make_tuple(true, ""); }