Skip to content

Commit 784003f

Browse files
authored
Close avio object *before* encode destruction. And flush, too. (#773)
1 parent f2d0b14 commit 784003f

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/torchcodec/_core/Encoder.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,18 @@ AVSampleFormat findBestOutputSampleFormat(const AVCodec& avCodec) {
9999
} // namespace
100100

101101
AudioEncoder::~AudioEncoder() {
102-
if (avFormatContext_ && avFormatContext_->pb && !avioContextHolder_) {
103-
avio_close(avFormatContext_->pb);
102+
close_avio();
103+
}
104+
105+
void AudioEncoder::close_avio() {
106+
if (avFormatContext_ && avFormatContext_->pb) {
107+
avio_flush(avFormatContext_->pb);
108+
109+
if (!avioContextHolder_) {
110+
avio_close(avFormatContext_->pb);
111+
// avoids closing again in destructor, which would segfault.
112+
avFormatContext_->pb = nullptr;
113+
}
104114
}
105115
}
106116

@@ -308,6 +318,8 @@ void AudioEncoder::encode() {
308318
status == AVSUCCESS,
309319
"Error in: av_write_trailer",
310320
getFFMPEGErrorStringFromErrorCode(status));
321+
322+
close_avio();
311323
}
312324

313325
UniqueAVFrame AudioEncoder::maybeConvertAVFrame(const UniqueAVFrame& avFrame) {

src/torchcodec/_core/Encoder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class AudioEncoder {
3333
void encodeFrame(AutoAVPacket& autoAVPacket, const UniqueAVFrame& avFrame);
3434
void maybeFlushSwrBuffers(AutoAVPacket& autoAVPacket);
3535
void flushBuffers();
36+
void close_avio();
3637

3738
UniqueEncodingAVFormatContext avFormatContext_;
3839
UniqueAVCodecContext avCodecContext_;

0 commit comments

Comments
 (0)