The pts and the corresponding duration is written in sidx
atoms, thus make sure these match up correctly.
---
libavformat/movenc.c | 9 +++++++++
libavformat/movenc.h | 1 +
2 files changed, 10 insertions(+)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 3ba1cc8..5109fd7 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -3287,6 +3287,11 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket
*pkt)
* which might not exactly match our dts. Therefore adjust the dts
* of this packet to be what the previous packets duration implies. */
trk->cluster[trk->entry].dts = trk->start_dts + trk->track_duration;
+ /* We also may have written the pts and the corresponding duration
+ * in sidx tags; make sure the sidx pts and duration match up with
+ * the next fragment. This means the cts of the first sample must
+ * be the same in all fragments. */
+ pkt->pts = pkt->dts + trk->start_cts;
}
if (!trk->entry && trk->start_dts == AV_NOPTS_VALUE && !mov->use_editlist
&&
s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO) {
@@ -3315,6 +3320,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
trk->flags |= MOV_TRACK_CTTS;
trk->cluster[trk->entry].cts = pkt->pts - pkt->dts;
trk->cluster[trk->entry].flags = 0;
+ if (trk->start_cts == AV_NOPTS_VALUE)
+ trk->start_cts = pkt->pts - pkt->dts;
+
if (enc->codec_id == AV_CODEC_ID_VC1) {
mov_parse_vc1_frame(pkt, trk, mov->fragments);
} else if (pkt->flags & AV_PKT_FLAG_KEY) {
@@ -3685,6 +3693,7 @@ static int mov_write_header(AVFormatContext *s)
* this is updated. */
track->hint_track = -1;
track->start_dts = AV_NOPTS_VALUE;
+ track->start_cts = AV_NOPTS_VALUE;
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
if (track->tag == MKTAG('m','x','3','p') || track->tag ==
MKTAG('m','x','3','n') ||
track->tag == MKTAG('m','x','4','p') || track->tag ==
MKTAG('m','x','4','n') ||
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index 4483b69..136bf13 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -104,6 +104,7 @@ typedef struct MOVTrack {
uint32_t tref_tag;
int tref_id; ///< trackID of the referenced track
int64_t start_dts;
+ int64_t start_cts;
int hint_track; ///< the track that hints this track, -1 if no
hint track is set
int src_track; ///< the track that this hint track describes
--
1.9.3 (Apple Git-50)
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel