summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Bouron <matthieu.bouron@stupeflix.com>2016-06-16 13:16:52 +0200
committerMatthieu Bouron <matthieu.bouron@stupeflix.com>2016-06-20 15:43:14 +0200
commitacfab2dce6d30ab30b953d10e2e0097d8f8cb29f (patch)
tree9202c97dfd7083587bd4f982190ac25a6639bdd7
parent0528410e04929d72ca29e5afddcc90d88de7208d (diff)
lavf/mov: ignore ctts entries that do not apply to a least one sample
Fixes packet pts of samples which contain ctts entries with count <= 0.
-rw-r--r--libavformat/mov.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 57a03543cc..3d59c0f5ee 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2574,7 +2574,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVStream *st;
MOVStreamContext *sc;
- unsigned int i, entries;
+ unsigned int i, entries, ctts_count = 0;
if (c->fc->nb_streams < 1)
return 0;
@@ -2600,8 +2600,16 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int count =avio_rb32(pb);
int duration =avio_rb32(pb);
- sc->ctts_data[i].count = count;
- sc->ctts_data[i].duration= duration;
+ if (count <= 0) {
+ av_log(c->fc, AV_LOG_TRACE,
+ "ignoring CTTS entry with count=%d duration=%d\n",
+ count, duration);
+ continue;
+ }
+
+ sc->ctts_data[ctts_count].count = count;
+ sc->ctts_data[ctts_count].duration = duration;
+ ctts_count++;
av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",
count, duration);
@@ -2617,7 +2625,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
mov_update_dts_shift(sc, duration);
}
- sc->ctts_count = i;
+ sc->ctts_count = ctts_count;
if (pb->eof_reached)
return AVERROR_EOF;