avformat/oggparsevp8: fix pts calculation on pages ending with an invisible frame
authorJames Almer <jamrial@gmail.com>
Tue, 12 Jul 2016 20:05:42 +0000 (17:05 -0300)
committerJames Almer <jamrial@gmail.com>
Mon, 25 Jul 2016 12:59:25 +0000 (09:59 -0300)
Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit 5adfbd391847fcdaea1e9b105fae2dd90af2a733)

libavformat/oggparsevp8.c

index 5959d32..7c67cc5 100644 (file)
@@ -79,7 +79,11 @@ static uint64_t vp8_gptopts(AVFormatContext *s, int idx, uint64_t granule, int64
     struct ogg *ogg = s->priv_data;
     struct ogg_stream *os = ogg->streams + idx;
 
-    uint64_t pts  = (granule >> 32);
+    int invcnt    = !((granule >> 30) & 3);
+    // If page granule is that of an invisible vp8 frame, its pts will be
+    // that of the end of the next visible frame. We substract 1 for those
+    // to prevent messing up pts calculations.
+    uint64_t pts  = (granule >> 32) - invcnt;
     uint32_t dist = (granule >>  3) & 0x07ffffff;
 
     if (!dist)