From a16243a4aa5fffff9d4cb0f20ceab47c80a2c4dc Mon Sep 17 00:00:00 2001 From: Neil Birkbeck Date: Thu, 3 Dec 2015 16:40:24 -0800 Subject: [PATCH] libavformat/mov.c: allow QuickTime metadata to come after traks QuickTime metadata can come after trak data. Add indicator for which trak is being parsed (-1 if none) so that global metadata after the trak can be parsed. Signed-off-by: Neil Birkbeck Signed-off-by: Michael Niedermayer --- libavformat/isom.h | 1 + libavformat/mov.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libavformat/isom.h b/libavformat/isom.h index a082e403b7..65a64d42b5 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -178,6 +178,7 @@ typedef struct MOVContext { int found_moov; ///< 'moov' atom has been found int found_mdat; ///< 'mdat' atom has been found int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found + int trak_index; ///< Index of the current 'trak' char **meta_keys; unsigned meta_keys_count; DVDemuxContext *dv_demux; diff --git a/libavformat/mov.c b/libavformat/mov.c index 5b5e0c836e..03aca0fde6 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -643,7 +643,7 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_log(c->fc, AV_LOG_TRACE, "ctype= %.4s (0x%08x)\n", (char*)&ctype, ctype); av_log(c->fc, AV_LOG_TRACE, "stype= %.4s\n", (char*)&type); - if (c->fc->nb_streams < 1) { // meta before first trak + if (c->trak_index < 0) { // meta not inside a trak if (type == MKTAG('m','d','t','a')) { c->found_hdlr_mdta = 1; } @@ -3073,10 +3073,13 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) st->priv_data = sc; st->codec->codec_type = AVMEDIA_TYPE_DATA; sc->ffindex = st->index; + c->trak_index = st->index; if ((ret = mov_read_default(c, pb, atom)) < 0) return ret; + c->trak_index = -1; + /* sanity checks */ if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count || (!sc->sample_size && !sc->sample_count))) { @@ -4617,6 +4620,7 @@ static int mov_read_header(AVFormatContext *s) int i; mov->fc = s; + mov->trak_index = -1; /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */ if (pb->seekable) atom.size = avio_size(pb);