diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 944541762a..cd98f762b8 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4055,6 +4055,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; } else { /* New fragment, but discontinuous from previous fragments. * Pretend the duration sum of the earlier fragments is @@ -4098,6 +4103,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) { @@ -4673,6 +4681,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 4cf6e3b6d9..72ae6c9584 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -112,6 +112,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 (or tmcd) track describes