[FFmpeg-cvslog] ismindex: use tfhd default duration if no sample duration

Mika Raento git at videolan.org
Thu Oct 16 12:54:31 CEST 2014


ffmpeg | branch: master | Mika Raento <mikie at iki.fi> | Thu Oct 16 08:55:17 2014 +0300| [979932378ae3fbf452e312eb759cc7ce175f78de] | committer: Martin Storsjö

ismindex: use tfhd default duration if no sample duration

Signed-off-by: Martin Storsjö <martin at martin.st>

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

 tools/ismindex.c |   23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/tools/ismindex.c b/tools/ismindex.c
index 53be5d6..387b185 100644
--- a/tools/ismindex.c
+++ b/tools/ismindex.c
@@ -225,7 +225,8 @@ fail:
     return ret;
 }
 
-static int64_t read_trun_duration(AVIOContext *in, int64_t end)
+static int64_t read_trun_duration(AVIOContext *in, int default_duration,
+                                  int64_t end)
 {
     int64_t ret = 0;
     int64_t pos;
@@ -233,7 +234,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end)
     int entries;
     avio_r8(in); /* version */
     flags = avio_rb24(in);
-    if (!(flags & MOV_TRUN_SAMPLE_DURATION)) {
+    if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) {
         fprintf(stderr, "No sample duration in trun flags\n");
         return -1;
     }
@@ -244,7 +245,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end)
 
     pos = avio_tell(in);
     for (i = 0; i < entries && pos < end; i++) {
-        int sample_duration = 0;
+        int sample_duration = default_duration;
         if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(in);
         if (flags & MOV_TRUN_SAMPLE_SIZE)     avio_rb32(in);
         if (flags & MOV_TRUN_SAMPLE_FLAGS)    avio_rb32(in);
@@ -265,6 +266,7 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset)
     int64_t ret = -1;
     int32_t moof_size, size, tag;
     int64_t pos = 0;
+    int default_duration = 0;
 
     avio_seek(in, offset, SEEK_SET);
     moof_size = avio_rb32(in);
@@ -282,8 +284,21 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset)
                 pos = avio_tell(in);
                 size = avio_rb32(in);
                 tag  = avio_rb32(in);
+                if (tag == MKBETAG('t', 'f', 'h', 'd')) {
+                    int flags = 0;
+                    avio_r8(in); /* version */
+                    flags = avio_rb24(in);
+                    avio_rb32(in); /* track_id */
+                    if (flags & MOV_TFHD_BASE_DATA_OFFSET)
+                        avio_rb64(in);
+                    if (flags & MOV_TFHD_STSD_ID)
+                        avio_rb32(in);
+                    if (flags & MOV_TFHD_DEFAULT_DURATION)
+                        default_duration = avio_rb32(in);
+                }
                 if (tag == MKBETAG('t', 'r', 'u', 'n')) {
-                    return read_trun_duration(in, pos + size);
+                    return read_trun_duration(in, default_duration,
+                                              pos + size);
                 }
                 avio_seek(in, pos + size, SEEK_SET);
             }



More information about the ffmpeg-cvslog mailing list