From 979932378ae3fbf452e312eb759cc7ce175f78de Mon Sep 17 00:00:00 2001 From: Mika Raento Date: Thu, 16 Oct 2014 08:55:17 +0300 Subject: ismindex: use tfhd default duration if no sample duration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- tools/ismindex.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'tools') diff --git a/tools/ismindex.c b/tools/ismindex.c index 53be5d6773..387b185feb 100644 --- a/tools/ismindex.c +++ b/tools/ismindex.c @@ -225,7 +225,8 @@ fail: return ret; } -static int64_t read_trun_duration(AVIOContext *in, int64_t end) +static int64_t read_trun_duration(AVIOContext *in, int default_duration, + int64_t end) { int64_t ret = 0; int64_t pos; @@ -233,7 +234,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end) int entries; avio_r8(in); /* version */ flags = avio_rb24(in); - if (!(flags & MOV_TRUN_SAMPLE_DURATION)) { + if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) { fprintf(stderr, "No sample duration in trun flags\n"); return -1; } @@ -244,7 +245,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end) pos = avio_tell(in); for (i = 0; i < entries && pos < end; i++) { - int sample_duration = 0; + int sample_duration = default_duration; 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); @@ -265,6 +266,7 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset) int64_t ret = -1; int32_t moof_size, size, tag; int64_t pos = 0; + int default_duration = 0; avio_seek(in, offset, SEEK_SET); moof_size = avio_rb32(in); @@ -282,8 +284,21 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset) pos = avio_tell(in); size = avio_rb32(in); tag = avio_rb32(in); + if (tag == MKBETAG('t', 'f', 'h', 'd')) { + int flags = 0; + avio_r8(in); /* version */ + flags = avio_rb24(in); + avio_rb32(in); /* track_id */ + if (flags & MOV_TFHD_BASE_DATA_OFFSET) + avio_rb64(in); + if (flags & MOV_TFHD_STSD_ID) + avio_rb32(in); + if (flags & MOV_TFHD_DEFAULT_DURATION) + default_duration = avio_rb32(in); + } if (tag == MKBETAG('t', 'r', 'u', 'n')) { - return read_trun_duration(in, pos + size); + return read_trun_duration(in, default_duration, + pos + size); } avio_seek(in, pos + size, SEEK_SET); } -- cgit v1.2.3