diff options
author | Matthieu Bouron <matthieu.bouron@stupeflix.com> | 2016-06-16 13:16:52 +0200 |
---|---|---|
committer | Matthieu Bouron <matthieu.bouron@stupeflix.com> | 2016-06-20 15:43:14 +0200 |
commit | acfab2dce6d30ab30b953d10e2e0097d8f8cb29f (patch) | |
tree | 9202c97dfd7083587bd4f982190ac25a6639bdd7 | |
parent | 0528410e04929d72ca29e5afddcc90d88de7208d (diff) | |
download | ffmpeg-acfab2dce6d30ab30b953d10e2e0097d8f8cb29f.tar.gz |
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.c | 16 |
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; |