summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorJanne Grunau <janne-libav@jannau.net>2012-02-02 16:30:27 +0100
committerJanne Grunau <janne-libav@jannau.net>2012-02-02 17:39:13 +0100
commit7f19bdc2a29e0f9e3fff0da8c5fc1d2f7f972efc (patch)
tree7d16ca7c9548b8762874939777772403ab6f837e /libavformat/mov.c
parent2c98f407c8803da3002747f3a8d43696e8744dc7 (diff)
movdec: fix dts generation in fragmented files
Do not use AVStream's duration for dts generation since it contains in some cases the duration of the whole file instead of duration of the samples in the moov. This happens if the mdhd holds the duration of the whole file but has no entries or a zero duration in its stts.
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 0ce32e0f8e..3c1927ff33 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1639,6 +1639,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->nb_frames= total_sample_count;
if (duration)
st->duration= duration;
+ sc->track_end = duration;
return 0;
}
@@ -2233,7 +2234,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if (flags & 0x001) data_offset = avio_rb32(pb);
if (flags & 0x004) first_sample_flags = avio_rb32(pb);
- dts = st->duration - sc->time_offset;
+ dts = sc->track_end - sc->time_offset;
offset = frag->base_data_offset + data_offset;
distance = 0;
av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
@@ -2263,7 +2264,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc->data_size += sample_size;
}
frag->moof_offset = offset;
- st->duration = dts + sc->time_offset;
+ st->duration = sc->track_end = dts + sc->time_offset;
return 0;
}