|
|
|
@@ -4093,6 +4093,32 @@ static int mov_flush_fragment(AVFormatContext *s) |
|
|
|
if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) |
|
|
|
return 0; |
|
|
|
|
|
|
|
for (i = 0; i < mov->nb_streams; i++) { |
|
|
|
MOVTrack *track = &mov->tracks[i]; |
|
|
|
if (track->entry <= 1) |
|
|
|
continue; |
|
|
|
// Sample durations are calculated as the diff of dts values, |
|
|
|
// but for the last sample in a fragment, we don't know the dts |
|
|
|
// of the first sample in the next fragment, so we have to rely |
|
|
|
// on what was set as duration in the AVPacket. Not all callers |
|
|
|
// set this though, so we might want to replace it with an |
|
|
|
// estimate if it currently is zero. |
|
|
|
if (get_cluster_duration(track, track->entry - 1) != 0) |
|
|
|
continue; |
|
|
|
// Use the duration (i.e. dts diff) of the second last sample for |
|
|
|
// the last one. This is a wild guess (and fatal if it turns out |
|
|
|
// to be too long), but probably the best we can do - having a zero |
|
|
|
// duration is bad as well. |
|
|
|
track->track_duration += get_cluster_duration(track, track->entry - 2); |
|
|
|
if (!mov->missing_duration_warned) { |
|
|
|
av_log(s, AV_LOG_WARNING, |
|
|
|
"Estimating the duration of the last packet in a " |
|
|
|
"fragment, consider setting the duration field in " |
|
|
|
"AVPacket instead.\n"); |
|
|
|
mov->missing_duration_warned = 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!mov->moov_written) { |
|
|
|
int64_t pos = avio_tell(s->pb); |
|
|
|
uint8_t *buf; |
|
|
|
|