diff options
author | Martin Storsjö <martin@martin.st> | 2014-10-06 23:20:50 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2014-10-14 13:52:32 +0300 |
commit | c2c22c75cf89e2faab34d1ee1d392cfb065439ea (patch) | |
tree | dcd99a49a03e44e846908763be21c98c702d557b | |
parent | eabdc2a830f1ab1a3f12243eb7e2fba801cb81f0 (diff) | |
download | ffmpeg-c2c22c75cf89e2faab34d1ee1d392cfb065439ea.tar.gz |
movenc: Write tfdt atoms
These allow getting the absolute start timestamp of a fragment
without reading preceding timestamps. This fixes sync between
tracks if starting from fragments in different streams that don't
align exactly.
This also is a prerequisite for producing DASH content.
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | libavformat/movenc.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index d8dc62a181..d84ddbea96 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2550,6 +2550,18 @@ static int mov_write_tfrf_tags(AVIOContext *pb, MOVMuxContext *mov, return 0; } +static int mov_write_tfdt_tag(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "tfdt"); + avio_w8(pb, 1); /* version */ + avio_wb24(pb, 0); + avio_wb64(pb, track->frag_start); + return update_size(pb, pos); +} + static int mov_write_traf_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track, int64_t moof_offset, int moof_size) @@ -2559,6 +2571,7 @@ static int mov_write_traf_tag(AVIOContext *pb, MOVMuxContext *mov, ffio_wfourcc(pb, "traf"); mov_write_tfhd_tag(pb, mov, track, moof_offset); + mov_write_tfdt_tag(pb, track); mov_write_trun_tag(pb, mov, track, moof_size); if (mov->mode == MODE_ISM) { mov_write_tfxd_tag(pb, track); |