+static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track)
+{
+ if (track->tag == MKTAG('t','m','c','d')) {
+ // tmcd tracks gets track_duration set in mov_write_moov_tag from
+ // another track's duration, while the end_pts may be left at zero.
+ // Calculate the pts duration for that track instead.
+ return av_rescale(calc_pts_duration(mov, &mov->tracks[track->src_track]),
+ track->timescale, mov->tracks[track->src_track].timescale);
+ }
+ if (track->end_pts != AV_NOPTS_VALUE &&
+ track->start_dts != AV_NOPTS_VALUE &&
+ track->start_cts != AV_NOPTS_VALUE) {
+ return track->end_pts - (track->start_dts + track->start_cts);
+ }
+ return track->track_duration;
+}
+