changeset 5817:eb9c746c3584 libavformat

oggdec: Determine pts and filepos on a packet basis in read_timestamp This takes into account whether the granule defines the start or end times of packets, and sets the correct file offset of the associated page.
author conrad
date Thu, 11 Mar 2010 07:17:56 +0000
parents c587ece53810
children 1a3c4f74f17d
files oggdec.c
diffstat 1 files changed, 7 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/oggdec.c	Thu Mar 11 07:17:53 2010 +0000
+++ b/oggdec.c	Thu Mar 11 07:17:56 2010 +0000
@@ -581,15 +581,14 @@
     int64_t pts = AV_NOPTS_VALUE;
     int i;
     url_fseek(bc, *pos_arg, SEEK_SET);
-    while (url_ftell(bc) < pos_limit && !ogg_read_page (s, &i)) {
-        if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
-            ogg->streams[i].codec && i == stream_index) {
-            pts = ogg_gptopts(s, i, ogg->streams[i].granule, NULL);
-            // FIXME: this is the position of the packet after the one with above
-            // pts.
-            *pos_arg = url_ftell(bc);
+    ogg_reset(ogg);
+
+    while (url_ftell(bc) < pos_limit && !ogg_packet(s, &i, NULL, NULL, pos_arg)) {
+        if (i == stream_index) {
+            pts = ogg_calc_pts(s, i, NULL);
+        }
+        if (pts != AV_NOPTS_VALUE)
             break;
-        }
     }
     ogg_reset(ogg);
     return pts;