movenc: Don't try to fix the fragment end duration if none will be written

If autoflushing on a new packet (e.g. due to the frag_every_frame
flag being set), there's no samples to be written in the new fragment,
so we can't overwrite the track duration in order to make it line
up with the next packet to be written.

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2021-08-05 15:30:18 +03:00
parent 43aeeab764
commit bff7d662d7
1 changed files with 15 additions and 10 deletions

View File

@ -5931,16 +5931,21 @@ static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt)
trk->entry && pkt->flags & AV_PKT_FLAG_KEY) ||
(mov->flags & FF_MOV_FLAG_FRAG_EVERY_FRAME)) {
if (frag_duration >= mov->min_fragment_duration) {
// Set the duration of this track to line up with the next
// sample in this track. This avoids relying on AVPacket
// duration, but only helps for this particular track, not
// for the other ones that are flushed at the same time.
trk->track_duration = pkt->dts - trk->start_dts;
if (pkt->pts != AV_NOPTS_VALUE)
trk->end_pts = pkt->pts;
else
trk->end_pts = pkt->dts;
trk->end_reliable = 1;
if (trk->entry) {
// Set the duration of this track to line up with the next
// sample in this track. This avoids relying on AVPacket
// duration, but only helps for this particular track, not
// for the other ones that are flushed at the same time.
//
// If we have trk->entry == 0, no fragment will be written
// for this track, and we can't adjust the track end here.
trk->track_duration = pkt->dts - trk->start_dts;
if (pkt->pts != AV_NOPTS_VALUE)
trk->end_pts = pkt->pts;
else
trk->end_pts = pkt->dts;
trk->end_reliable = 1;
}
mov_auto_flush_fragment(s, 0);
}
}