PR #20652 opened by Martin Storsjö (mstorsjo) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20652 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20652.patch
Write the moov tag at the end first, before overwriting the mdat size at the start of the file. In case writing the final moov box fails (e.g. due to being out of disk, or other reasons), we haven't broken the initial moov box yet. Thus if writing stops between these steps, we could end up with a file with two moov boxes - which arguably is more feasible to recover from, than from a file with no moov boxes at all. From 2b81caccddb488b94d13072c2329b34abce4ebb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <[email protected]> Date: Fri, 27 Jun 2025 15:11:13 +0300 Subject: [PATCH] movenc: Make the hybrid_fragmented mode more robust Write the moov tag at the end first, before overwriting the mdat size at the start of the file. In case writing the final moov box fails (e.g. due to being out of disk, or other reasons), we haven't broken the initial moov box yet. Thus if writing stops between these steps, we could end up with a file with two moov boxes - which arguably is more feasible to recover from, than from a file with no moov boxes at all. --- libavformat/movenc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 067d38b14b..8c5bccd8c9 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -8605,6 +8605,11 @@ static int mov_write_trailer(AVFormatContext *s) // Clear the empty_moov flag, as we do want the moov to include // all the samples at this point. mov->flags &= ~FF_MOV_FLAG_EMPTY_MOOV; + + // Write the moov tag first, to make sure we have all the info + // written, before overwriting the size of the mdat tag. + if ((res = mov_write_moov_tag(pb, mov, s)) < 0) + return res; } moov_pos = avio_tell(pb); @@ -8647,7 +8652,7 @@ static int mov_write_trailer(AVFormatContext *s) ffio_wfourcc(pb, "free"); ffio_fill(pb, 0, size - 8); avio_seek(pb, moov_pos, SEEK_SET); - } else { + } else if (!(mov->flags & FF_MOV_FLAG_HYBRID_FRAGMENTED)) { if ((res = mov_write_moov_tag(pb, mov, s)) < 0) return res; } -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
