aboutsummaryrefslogtreecommitdiffstats
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
parent2c98f407c8803da3002747f3a8d43696e8744dc7 (diff)
downloadffmpeg-7f19bdc2a29e0f9e3fff0da8c5fc1d2f7f972efc.tar.gz
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.
-rw-r--r--libavformat/isom.h1
-rw-r--r--libavformat/mov.c5
2 files changed, 4 insertions, 2 deletions
diff --git a/libavformat/isom.h b/libavformat/isom.h
index 16d777651a..91fbf759f8 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -126,6 +126,7 @@ typedef struct MOVStreamContext {
uint32_t palette[256];
int has_palette;
int64_t data_size;
+ int64_t track_end; ///< used for dts generation in fragmented movie files
} MOVStreamContext;
typedef struct MOVContext {
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;
}