From 4fa56c5677a2b93853b3b5420b65aa0d4b56474a Mon Sep 17 00:00:00 2001
From: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
Date: Thu, 12 May 2011 05:28:27 +0900
Subject: [PATCH] mov: Support edit list atom version 1.

---
 libavformat/isom.h |    2 +-
 libavformat/mov.c  |   16 +++++++++++-----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/libavformat/isom.h b/libavformat/isom.h
index 48e0bcf..ef3fe14 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -109,7 +109,7 @@ typedef struct MOVStreamContext {
     unsigned int keyframe_count;
     int *keyframes;
     int time_scale;
-    int time_offset;      ///< time offset of the first edit list entry
+    int64_t time_offset;  ///< time offset of the first edit list entry
     int current_sample;
     unsigned int bytes_per_frame;
     unsigned int samples_per_frame;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 90f583f..13777a4 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2163,13 +2163,13 @@ free_and_return:
 static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     MOVStreamContext *sc;
-    int i, edit_count;
+    int i, edit_count, version;
 
     if (c->fc->nb_streams < 1)
         return 0;
     sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;
 
-    avio_r8(pb); /* version */
+    version = avio_r8(pb); /* version */
     avio_rb24(pb); /* flags */
     edit_count = avio_rb32(pb); /* entries */
 
@@ -2177,9 +2177,15 @@ static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
         return -1;
 
     for(i=0; i<edit_count; i++){
-        int time;
-        int duration = avio_rb32(pb); /* Track duration */
-        time = avio_rb32(pb); /* Media time */
+        int64_t time;
+        int64_t duration;
+        if (version == 1) {
+            duration = avio_rb64(pb);
+            time = avio_rb64(pb);
+        } else {
+            duration = avio_rb32(pb); /* Segment duration */
+            time = avio_rb32(pb); /* Media time */
+        }
         avio_rb32(pb); /* Media rate */
         if (i == 0 && time >= -1) {
             sc->time_offset = time != -1 ? time : -duration;
-- 
1.7.0.2.msysgit.0

