diff options
author | Mika Raento <mikie@iki.fi> | 2014-10-16 08:55:17 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2014-10-16 09:22:22 +0300 |
commit | 979932378ae3fbf452e312eb759cc7ce175f78de (patch) | |
tree | 7e73d12356a5d7a2913523614d36e13602def55c /tools | |
parent | 460b509a34fb5fad3bedac8429f53594d3923ea8 (diff) | |
download | ffmpeg-979932378ae3fbf452e312eb759cc7ce175f78de.tar.gz |
ismindex: use tfhd default duration if no sample duration
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/ismindex.c | 23 |
1 files changed, 19 insertions, 4 deletions
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); } |