[FFmpeg-cvslog] ismindex: Calculate the pts duration of trun atoms, not the dts duration

Martin Storsjö git at videolan.org
Thu Mar 19 14:21:16 CET 2015


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Mon Mar 16 00:18:37 2015 +0200| [30a041887f89cd97c372ad6a516da6e012f2c88b] | committer: Martin Storsjö

ismindex: Calculate the pts duration of trun atoms, not the dts duration

Since the duration is compared to the tfra durations/intervals which
are expressed in pts, calculate that here as well.

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

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

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

diff --git a/tools/ismindex.c b/tools/ismindex.c
index 387b185..f3bfec0 100644
--- a/tools/ismindex.c
+++ b/tools/ismindex.c
@@ -228,10 +228,12 @@ fail:
 static int64_t read_trun_duration(AVIOContext *in, int default_duration,
                                   int64_t end)
 {
-    int64_t ret = 0;
+    int64_t dts = 0;
     int64_t pos;
     int flags, i;
     int entries;
+    int64_t first_pts = 0;
+    int64_t max_pts = 0;
     avio_r8(in); /* version */
     flags = avio_rb24(in);
     if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) {
@@ -246,19 +248,23 @@ static int64_t read_trun_duration(AVIOContext *in, int default_duration,
     pos = avio_tell(in);
     for (i = 0; i < entries && pos < end; i++) {
         int sample_duration = default_duration;
+        int64_t pts = dts;
         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);
-        if (flags & MOV_TRUN_SAMPLE_CTS)      avio_rb32(in);
+        if (flags & MOV_TRUN_SAMPLE_CTS)      pts += avio_rb32(in);
         if (sample_duration < 0) {
             fprintf(stderr, "Negative sample duration %d\n", sample_duration);
             return -1;
         }
-        ret += sample_duration;
+        if (i == 0)
+            first_pts = pts;
+        max_pts = FFMAX(max_pts, pts + sample_duration);
+        dts += sample_duration;
         pos = avio_tell(in);
     }
 
-    return ret;
+    return max_pts - first_pts;
 }
 
 static int64_t read_moof_duration(AVIOContext *in, int64_t offset)



More information about the ffmpeg-cvslog mailing list