From 5ea5a24eb70646a9061b85af407fcbb5dd4f89fd Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Tue, 20 Oct 2015 22:30:03 +0300 Subject: movenc: Honor flush requests with delay_moov, when some tracks lack samples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This also makes sure that a fragmented file without the empty_moov flag (i.e. with a non-empty initial moov fragment) actually gets written, if some of the tracks turn out to not have any samples. Signed-off-by: Martin Storsjö --- libavformat/movenc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'libavformat/movenc.c') diff --git a/libavformat/movenc.c b/libavformat/movenc.c index ee2f0892f0..572e781fdc 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3167,7 +3167,7 @@ static int mov_flush_fragment_interleaving(AVFormatContext *s, MOVTrack *track) return 0; } -static int mov_flush_fragment(AVFormatContext *s) +static int mov_flush_fragment(AVFormatContext *s, int force) { MOVMuxContext *mov = s->priv_data; int i, first_track = -1; @@ -3214,7 +3214,7 @@ static int mov_flush_fragment(AVFormatContext *s) if (!mov->tracks[i].entry) break; /* Don't write the initial moov unless all tracks have data */ - if (i < mov->nb_streams) + if (i < mov->nb_streams && !force) return 0; if ((ret = ffio_open_null_buf(&moov_buf)) < 0) @@ -3343,17 +3343,17 @@ static int mov_flush_fragment(AVFormatContext *s) return 0; } -static int mov_auto_flush_fragment(AVFormatContext *s) +static int mov_auto_flush_fragment(AVFormatContext *s, int force) { MOVMuxContext *mov = s->priv_data; int had_moov = mov->moov_written; - int ret = mov_flush_fragment(s); + int ret = mov_flush_fragment(s, force); if (ret < 0) return ret; // If using delay_moov, the first flush only wrote the moov, // not the actual moof+mdat pair, thus flush once again. if (!had_moov && mov->flags & FF_MOV_FLAG_DELAY_MOOV) - ret = mov_flush_fragment(s); + ret = mov_flush_fragment(s, force); return ret; } @@ -3568,7 +3568,7 @@ err: static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) { if (!pkt) { - mov_flush_fragment(s); + mov_flush_fragment(s, 1); return 1; } else { MOVMuxContext *mov = s->priv_data; @@ -3604,7 +3604,7 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) // for the other ones that are flushed at the same time. trk->track_duration = pkt->dts - trk->start_dts; trk->end_pts = pkt->pts; - mov_auto_flush_fragment(s); + mov_auto_flush_fragment(s, 0); } } @@ -4243,7 +4243,7 @@ static int mov_write_trailer(AVFormatContext *s) mov_write_moov_tag(pb, mov, s); } } else { - mov_auto_flush_fragment(s); + mov_auto_flush_fragment(s, 1); for (i = 0; i < mov->nb_streams; i++) mov->tracks[i].data_offset = 0; if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX) { -- cgit v1.2.3