aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-03-16 20:49:52 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2009-03-16 20:49:52 +0000
commit2ac736a6dadd174d1056beb75de6f85022b4fd1e (patch)
treed47a57b1f5fff92489dce72c21485311c8501e34
parentc3df4a3bfefbab046829bb1fc7d7a2d85e4344fc (diff)
downloadffmpeg-2ac736a6dadd174d1056beb75de6f85022b4fd1e.tar.gz
Extend mov edit list support to work for a first padding entry with
time == -1 and duration. Complicated since time is relative to stream, duration relative to container time base. Originally committed as revision 18019 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/mov.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index eec6ce59a6..bb0c035ca6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1278,8 +1278,9 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
/* adjust first dts according to edit list */
if (sc->time_offset) {
+ int rescaled = sc->time_offset < 0 ? av_rescale(sc->time_offset, sc->time_scale, mov->time_scale) : sc->time_offset;
assert(sc->time_offset % sc->time_rate == 0);
- current_dts = - (sc->time_offset / sc->time_rate);
+ current_dts = - (rescaled / sc->time_rate);
}
/* only use old uncompressed audio chunk demuxing when stts specifies it */
@@ -1774,12 +1775,12 @@ static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
for(i=0; i<edit_count; i++){
int time;
- get_be32(pb); /* Track duration */
+ int duration = get_be32(pb); /* Track duration */
time = get_be32(pb); /* Media time */
get_be32(pb); /* Media rate */
- if (i == 0 && time != -1) {
- sc->time_offset = time;
- sc->time_rate = av_gcd(sc->time_rate, time);
+ if (i == 0 && time >= -1) {
+ sc->time_offset = time != -1 ? time : -duration;
+ sc->time_rate = av_gcd(sc->time_rate, FFABS(sc->time_offset));
}
}