[FFmpeg-devel] [PATCH] libavformat/mov.c: allow QuickTime metadata to come after traks

Neil Birkbeck neil.birkbeck at gmail.com
Fri Dec 4 01:40:24 CET 2015


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 <neil.birkbeck at gmail.com>
---
 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 a082e40..65a64d4 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 cee037b..1f97d3e 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);
-- 
2.6.0.rc2.230.g3dd15c0



More information about the ffmpeg-devel mailing list