From 30a041887f89cd97c372ad6a516da6e012f2c88b Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Mon, 16 Mar 2015 00:18:37 +0200 Subject: ismindex: Calculate the pts duration of trun atoms, not the dts duration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the duration is compared to the tfra durations/intervals which are expressed in pts, calculate that here as well. Signed-off-by: Martin Storsjö --- tools/ismindex.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'tools') 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) -- cgit v1.2.3