Merge commit '40665d27e38e6a2f65037878202bd1a398c7683e'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Nov 2014 00:56:05 +0000 (01:56 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Nov 2014 00:56:05 +0000 (01:56 +0100)
* commit '40665d27e38e6a2f65037878202bd1a398c7683e':
  flvdec: Document how the duration is retrieved at the end of the file

Conflicts:
libavformat/flvdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/flvdec.c

@@@ -882,13 -842,16 +882,17 @@@ skip
  
      // if not streamed and no duration from metadata then seek to end to find
      // the duration from the timestamps
 -    if (s->pb->seekable && (!s->duration || s->duration == AV_NOPTS_VALUE)) {
 +    if (s->pb->seekable && (!s->duration || s->duration == AV_NOPTS_VALUE) && !flv->searched_for_end) {
          int size;
          const int64_t pos   = avio_tell(s->pb);
 -        const int64_t fsize = avio_size(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.
 +        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);