changeset 1104:2a31a69400f3 libavformat

fix seek related bugs
author mru
date Sun, 04 Jun 2006 15:06:18 +0000
parents 997e01f17ad3
children d187ac890c0e
files ogg2.c
diffstat 1 files changed, 14 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ogg2.c	Thu Jun 01 23:22:07 2006 +0000
+++ b/ogg2.c	Sun Jun 04 15:06:18 2006 +0000
@@ -449,6 +449,7 @@
 {
     ogg_t *ogg = s->priv_data;
     int idx = -1, i;
+    offset_t size, end;
 
     if(s->pb.is_streamed)
         return 0;
@@ -457,8 +458,13 @@
     if (s->duration != AV_NOPTS_VALUE)
         return 0;
 
+    size = url_fsize(&s->pb);
+    if(size < 0)
+        return 0;
+    end = size > MAX_PAGE_SIZE? size - MAX_PAGE_SIZE: size;
+
     ogg_save (s);
-    url_fseek (&s->pb, -MAX_PAGE_SIZE, SEEK_END);
+    url_fseek (&s->pb, end, SEEK_SET);
 
     while (!ogg_read_page (s, &i)){
         if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0)
@@ -470,7 +476,7 @@
             ogg_gptopts (s, idx, ogg->streams[idx].granule);
     }
 
-    ogg->size = url_fsize(&s->pb);
+    ogg->size = size;
     ogg_restore (s, 0);
 
     return 0;
@@ -547,10 +553,11 @@
 ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
                int flags)
 {
+    AVStream *st = s->streams[stream_index];
     ogg_t *ogg = s->priv_data;
     ByteIOContext *bc = &s->pb;
     uint64_t min = 0, max = ogg->size;
-    uint64_t tmin = 0, tmax = s->duration;
+    uint64_t tmin = 0, tmax = st->duration;
     int64_t pts = AV_NOPTS_VALUE;
 
     ogg_save (s);
@@ -562,7 +569,8 @@
         url_fseek (bc, p, SEEK_SET);
 
         while (!ogg_read_page (s, &i)){
-            if (ogg->streams[i].granule != 0 && ogg->streams[i].granule != -1)
+            if (i == stream_index && ogg->streams[i].granule != 0 &&
+                ogg->streams[i].granule != -1)
                 break;
         }
 
@@ -572,7 +580,7 @@
         pts = ogg_gptopts (s, i, ogg->streams[i].granule);
         p = url_ftell (bc);
 
-        if (ABS (pts - target_ts) < 1000000LL)
+        if (ABS (pts - target_ts) * st->time_base.num < st->time_base.den)
             break;
 
         if (pts > target_ts){
@@ -584,7 +592,7 @@
         }
     }
 
-    if (ABS (pts - target_ts) < 1000000LL){
+    if (ABS (pts - target_ts) * st->time_base.num < st->time_base.den){
         ogg_restore (s, 1);
         ogg_reset (ogg);
     }else{