diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-02-08 04:27:07 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2009-02-08 04:27:07 +0000 |
commit | baf2ffd3297b707dbb5794ec568c61091acf5c0c (patch) | |
tree | b4271e1001514e0d298122b8eeea25dc3194fa66 | |
parent | 6bab47995503d1a0320e26d797567ecd28bffad3 (diff) | |
download | ffmpeg-baf2ffd3297b707dbb5794ec568c61091acf5c0c.tar.gz |
offset dts according to edit list, hackish but works, based on patch by Reimar
Originally committed as revision 17037 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/mov.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index ba32ca7f13..a26ae43036 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -125,6 +125,7 @@ typedef struct MOVStreamContext { int *keyframes; int time_scale; int time_rate; + int time_offset; /// time offset of the first edit list entry int current_sample; unsigned int bytes_per_frame; unsigned int samples_per_frame; @@ -1231,6 +1232,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st) unsigned int stss_index = 0; unsigned int i, j; + /* adjust first dts according to edit list */ + if (sc->time_offset) { + assert(sc->time_offset % sc->time_rate == 0); + current_dts = - (sc->time_offset / sc->time_rate); + } + /* only use old uncompressed audio chunk demuxing when stts specifies it */ if (!(st->codec->codec_type == CODEC_TYPE_AUDIO && sc->stts_count == 1 && sc->stts_data[0].duration == 1)) { @@ -1762,10 +1769,14 @@ static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom) get_be32(pb); /* Track duration */ time = get_be32(pb); /* Media time */ get_be32(pb); /* Media rate */ - if (time != 0) - av_log(c->fc, AV_LOG_WARNING, "edit list not starting at 0, " - "a/v desync might occur, patch welcome\n"); + if (i == 0 && time != -1) + sc->time_offset = time; } + + if(edit_count > 1) + av_log(c->fc, AV_LOG_WARNING, "multiple edit list entries, " + "a/v desync might occur, patch welcome\n"); + dprintf(c->fc, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, sc->edit_count); return 0; } |