diff --git a/tools/ismindex.c b/tools/ismindex.c index 387b185feb..f3bfec0a96 100644 --- a/tools/ismindex.c +++ b/tools/ismindex.c @@ -228,10 +228,12 @@ fail: static int64_t read_trun_duration(AVIOContext *in, int default_duration, int64_t end) { - int64_t ret = 0; + int64_t dts = 0; int64_t pos; int flags, i; int entries; + int64_t first_pts = 0; + int64_t max_pts = 0; avio_r8(in); /* version */ flags = avio_rb24(in); if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) { @@ -246,19 +248,23 @@ static int64_t read_trun_duration(AVIOContext *in, int default_duration, pos = avio_tell(in); for (i = 0; i < entries && pos < end; i++) { int sample_duration = default_duration; + int64_t pts = dts; if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(in); if (flags & MOV_TRUN_SAMPLE_SIZE) avio_rb32(in); if (flags & MOV_TRUN_SAMPLE_FLAGS) avio_rb32(in); - if (flags & MOV_TRUN_SAMPLE_CTS) avio_rb32(in); + if (flags & MOV_TRUN_SAMPLE_CTS) pts += avio_rb32(in); if (sample_duration < 0) { fprintf(stderr, "Negative sample duration %d\n", sample_duration); return -1; } - ret += sample_duration; + if (i == 0) + first_pts = pts; + max_pts = FFMAX(max_pts, pts + sample_duration); + dts += sample_duration; pos = avio_tell(in); } - return ret; + return max_pts - first_pts; } static int64_t read_moof_duration(AVIOContext *in, int64_t offset)