[FFmpeg-cvslog] lavf/mov: simplify timecode track ref.

Clément Bœsch git at videolan.org
Tue Jan 1 16:22:29 CET 2013


ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Tue Jan  1 15:42:33 2013 +0100| [8d398f40b4a18fec8467c8b074344e4e24853c46] | committer: Clément Bœsch

lavf/mov: simplify timecode track ref.

There can be only one track reference. The multiple tref handling is
handled at a different level.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8d398f40b4a18fec8467c8b074344e4e24853c46
---

 libavformat/isom.h |    4 +---
 libavformat/mov.c  |   29 +++++++----------------------
 2 files changed, 8 insertions(+), 25 deletions(-)

diff --git a/libavformat/isom.h b/libavformat/isom.h
index f6eba56..0360c53 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -128,9 +128,7 @@ typedef struct MOVStreamContext {
     unsigned drefs_count;
     MOVDref *drefs;
     int dref_id;
-    unsigned tref_type;
-    unsigned trefs_count;
-    uint32_t *trefs;
+    int timecode_track;
     int wrong_dts;        ///< dts are wrong due to huge ctts offset (iMovie files)
     int width;            ///< tkhd width
     int height;           ///< tkhd height
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 560acf9..97edcd3 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2698,24 +2698,12 @@ static int mov_read_chan2(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 
 static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
-    uint32_t i;
     MOVStreamContext *sc;
 
     if (c->fc->nb_streams < 1)
         return AVERROR_INVALIDDATA;
     sc = c->fc->streams[c->fc->nb_streams - 1]->priv_data;
-
-    if (atom.size < 4)
-        return 0;
-
-    sc->trefs_count = atom.size / 4;
-    sc->trefs = av_malloc(sc->trefs_count * sizeof(*sc->trefs));
-    if (!sc->trefs)
-        return AVERROR(ENOMEM);
-
-    sc->tref_type = atom.type;
-    for (i = 0; i < sc->trefs_count; i++)
-        sc->trefs[i] = avio_rb32(pb);
+    sc->timecode_track = avio_rb32(pb);
     return 0;
 }
 
@@ -3077,7 +3065,6 @@ static int mov_read_close(AVFormatContext *s)
             av_freep(&sc->drefs[j].dir);
         }
         av_freep(&sc->drefs);
-        av_freep(&sc->trefs);
         if (sc->pb && sc->pb != s->pb)
             avio_close(sc->pb);
         sc->pb = NULL;
@@ -3105,17 +3092,15 @@ static int mov_read_close(AVFormatContext *s)
 
 static int tmcd_is_referenced(AVFormatContext *s, int tmcd_id)
 {
-    int i, j;
+    int i;
 
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
         MOVStreamContext *sc = st->priv_data;
 
-        if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_VIDEO)
-            continue;
-        for (j = 0; j < sc->trefs_count; j++)
-            if (tmcd_id == sc->trefs[j])
-                return 1;
+        if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
+            sc->timecode_track == tmcd_id)
+            return 1;
     }
     return 0;
 }
@@ -3178,9 +3163,9 @@ static int mov_read_header(AVFormatContext *s)
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
         MOVStreamContext *sc = st->priv_data;
-        if (sc->tref_type == AV_RL32("tmcd") && sc->trefs_count) {
+        if (sc->timecode_track > 0) {
             AVDictionaryEntry *tcr;
-            int tmcd_st_id = sc->trefs[0] - 1;
+            int tmcd_st_id = sc->timecode_track - 1;
 
             if (tmcd_st_id < 0 || tmcd_st_id >= s->nb_streams)
                 continue;



More information about the ffmpeg-cvslog mailing list