aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-02-08 04:27:07 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-02-08 04:27:07 +0000
commitbaf2ffd3297b707dbb5794ec568c61091acf5c0c (patch)
treeb4271e1001514e0d298122b8eeea25dc3194fa66 /libavformat/mov.c
parent6bab47995503d1a0320e26d797567ecd28bffad3 (diff)
downloadffmpeg-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
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c17
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;
}