[FFmpeg-cvslog] avformat/movenc: Fix flush fragment
Zhao Zhili
git at videolan.org
Sun Jun 1 11:47:48 EEST 2025
ffmpeg | branch: master | Zhao Zhili <zhilizhao at tencent.com> | Thu May 22 17:37:05 2025 +0800| [56cf1c084d50e1b8bb2e667bb9c0aaecb4ae48fc] | committer: Zhao Zhili
avformat/movenc: Fix flush fragment
The follow cmd output corrupted file before the patch:
ffmpeg -f lavfi -i color=blue,trim=duration=0.04 \
-f lavfi -i anullsrc,atrim=duration=2 \
-movflags +empty_moov+hybrid_fragmented \
-frag_duration 1000000 \
-frag_interleave 1 \
output.mp4
1. first_track is the first track with track->entry != 0. As in the
command above, video track (track index 0) has a single frame. When
flush the second fragment, first_track is 1, the audio track.
2. write_moof = i == first_track, so write_moof is false for i = 0.
3. When mov->frag_interleave != 0, mov->mdat_buf != NULL, because
it contains audio data. So avio_write is called before write_moof,
that is, the data write before moof, and mov_finish_fragment
executed with wrong mdat_start.
4. With normal fmp4 output, the error isn't obvious. With
hybrid_fragmented, ffplay output.mp4 shows a lot of error messages.
Signed-off-by: Zhao Zhili <zhilizhao at tencent.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=56cf1c084d50e1b8bb2e667bb9c0aaecb4ae48fc
---
libavformat/movenc.c | 4 ++--
tests/fate/mov.mak | 5 +++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f11633525e..246fc2912c 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -6509,9 +6509,9 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
int buf_size, write_moof = 1, moof_tracks = -1;
uint8_t *buf;
+ if (!track->entry)
+ continue;
if (mov->flags & FF_MOV_FLAG_SEPARATE_MOOF) {
- if (!track->entry)
- continue;
mdat_size = avio_tell(track->mdat_buf);
moof_tracks = i;
} else {
diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index f7e5e52217..6ab61e9f00 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -84,6 +84,11 @@ fate-mov-ibi-elst-starts-b: CMD = framemd5 -flags +bitexact -i $(TARGET_SAMPLES)
# Makes sure that we handle overlapping framgments
fate-mov-frag-overlap: CMD = framemd5 -i $(TARGET_SAMPLES)/mov/frag_overlap.mp4
+fate-mov-mp4-frag-flush: CMD = md5 -f lavfi -i color=blue,format=rgb24,trim=duration=0.04 -f lavfi -i anullsrc,aformat=s16,atrim=duration=2 -c:v png -c:a pcm_s16le -movflags +empty_moov+hybrid_fragmented -frag_duration 1000000 -frag_interleave 1 -f mp4
+fate-mov-mp4-frag-flush: CMP = oneline
+fate-mov-mp4-frag-flush: REF = a10c0e2e2dfc120f31ca5e59e0e4392a
+FATE_MOV-$(call ALLYES, LAVFI_INDEV, COLOR_FILTER, FORMAT_FILTER, TRIM_FILTER, ANULL_FILTER, AFORMAT_FILTER, ATRIM_FILTER, PNG_ENCODER, PCM_S16LE_ENCODER, MOV_MUXER) += fate-mov-mp4-frag-flush
+
# Makes sure that we pick the right frames according to edit list when there is no keyframe with PTS < edit list start.
# For example, when video starts on a B-frame, and edit list starts on that B-frame too.
# GOP structure : B B I in presentation order.
More information about the ffmpeg-cvslog
mailing list