From 85a63d475e641a98b2a575854bd9d92c779b2822 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Sat, 12 Jul 2025 21:32:49 +0100 Subject: [PATCH 1/2] Fix?? --- src/torchcodec/_core/Encoder.cpp | 16 ++++++++++++++-- src/torchcodec/_core/Encoder.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/torchcodec/_core/Encoder.cpp b/src/torchcodec/_core/Encoder.cpp index 5a6a0d7e..2c7d275c 100644 --- a/src/torchcodec/_core/Encoder.cpp +++ b/src/torchcodec/_core/Encoder.cpp @@ -99,8 +99,18 @@ AVSampleFormat findBestOutputSampleFormat(const AVCodec& avCodec) { } // namespace AudioEncoder::~AudioEncoder() { - if (avFormatContext_ && avFormatContext_->pb && !avioContextHolder_) { - avio_close(avFormatContext_->pb); + close_avio(); +} + +void AudioEncoder::close_avio() { + if (avFormatContext_ && avFormatContext_->pb) { + avio_flush(avFormatContext_->pb); + + if (!avioContextHolder_) { + avio_close(avFormatContext_->pb); + // avoids closing again in destructor, which would segfault. + avFormatContext_->pb = nullptr; + } } } @@ -308,6 +318,8 @@ void AudioEncoder::encode() { status == AVSUCCESS, "Error in: av_write_trailer", getFFMPEGErrorStringFromErrorCode(status)); + + close_avio(); } UniqueAVFrame AudioEncoder::maybeConvertAVFrame(const UniqueAVFrame& avFrame) { diff --git a/src/torchcodec/_core/Encoder.h b/src/torchcodec/_core/Encoder.h index 04ed6a13..723849f0 100644 --- a/src/torchcodec/_core/Encoder.h +++ b/src/torchcodec/_core/Encoder.h @@ -33,6 +33,7 @@ class AudioEncoder { void encodeFrame(AutoAVPacket& autoAVPacket, const UniqueAVFrame& avFrame); void maybeFlushSwrBuffers(AutoAVPacket& autoAVPacket); void flushBuffers(); + void close_avio(); UniqueEncodingAVFormatContext avFormatContext_; UniqueAVCodecContext avCodecContext_; From f14bb1dbc509946d2d0ac2f3a5def3654a028f21 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Sat, 12 Jul 2025 21:56:01 +0100 Subject: [PATCH 2/2] Lint --- src/torchcodec/_core/Encoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torchcodec/_core/Encoder.cpp b/src/torchcodec/_core/Encoder.cpp index 2c7d275c..ce33613c 100644 --- a/src/torchcodec/_core/Encoder.cpp +++ b/src/torchcodec/_core/Encoder.cpp @@ -109,7 +109,7 @@ void AudioEncoder::close_avio() { if (!avioContextHolder_) { avio_close(avFormatContext_->pb); // avoids closing again in destructor, which would segfault. - avFormatContext_->pb = nullptr; + avFormatContext_->pb = nullptr; } } }