summaryrefslogtreecommitdiff
path: root/tools/ismindex.c
diff options
context:
space:
mode:
authorMika Raento <mikie@iki.fi>2014-10-16 08:55:17 +0300
committerMartin Storsjö <martin@martin.st>2014-10-16 09:22:22 +0300
commit979932378ae3fbf452e312eb759cc7ce175f78de (patch)
tree7e73d12356a5d7a2913523614d36e13602def55c /tools/ismindex.c
parent460b509a34fb5fad3bedac8429f53594d3923ea8 (diff)
downloadffmpeg-979932378ae3fbf452e312eb759cc7ce175f78de.tar.gz
ismindex: use tfhd default duration if no sample duration
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'tools/ismindex.c')
-rw-r--r--tools/ismindex.c23
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);
}