Merge commit 'e4eb13ca77624401ea7cef1ed6ad8e2d13fd2063'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 27 Jan 2016 18:32:28 +0000 (18:32 +0000)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Wed, 27 Jan 2016 18:32:28 +0000 (18:32 +0000)
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavformat/flvdec.c

@@@ -985,24 -843,19 +985,26 @@@ skip
          const int64_t pos   = avio_tell(s->pb);
          // Read the last 4 bytes of the file, this should be the size of the
          // previous FLV tag. Use the timestamp of its payload as duration.
 -        const int64_t fsize = avio_size(s->pb);
 +        int64_t fsize       = avio_size(s->pb);
 +retry_duration:
          avio_seek(s->pb, fsize - 4, SEEK_SET);
          size = avio_rb32(s->pb);
-         // Seek to the start of the last FLV tag at position (fsize - 4 - size)
-         // but skip the byte indicating the type.
-         avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
-         if (size == avio_rb24(s->pb) + 11) {
-             uint32_t ts = avio_rb24(s->pb);
-             ts         |= avio_r8(s->pb) << 24;
-             if (ts)
-                 s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
-             else if (fsize >= 8 && fsize - 8 >= size) {
-                 fsize -= size+4;
-                 goto retry_duration;
+         if (size > 0 && size < fsize) {
+             // Seek to the start of the last FLV tag at position (fsize - 4 - size)
+             // but skip the byte indicating the type.
+             avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
+             if (size == avio_rb24(s->pb) + 11) {
+                 uint32_t ts = avio_rb24(s->pb);
+                 ts         |= avio_r8(s->pb) << 24;
 -                s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
++                if (ts)
++                    s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
++                else if (fsize >= 8 && fsize - 8 >= size) {
++                    fsize -= size+4;
++                    goto retry_duration;
++                }
              }
          }
 +
          avio_seek(s->pb, pos, SEEK_SET);
          flv->searched_for_end = 1;
      }