summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMåns Rullgård <mans@mansr.com>2006-06-04 15:06:18 +0000
committerMåns Rullgård <mans@mansr.com>2006-06-04 15:06:18 +0000
commit56466d7b4ebd1736adac3c54ab57cd9eac9579a9 (patch)
tree6d4d654b94b3123f31c6e5e4c3725e9c2d4041a3
parent0d18f79860c2c24039c7f9c0d720b95deab032d8 (diff)
fix seek related bugs
Originally committed as revision 5453 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/ogg2.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/libavformat/ogg2.c b/libavformat/ogg2.c
index 71b4d69a97..ce1bcbae6a 100644
--- a/libavformat/ogg2.c
+++ b/libavformat/ogg2.c
@@ -449,6 +449,7 @@ ogg_get_length (AVFormatContext * s)
{
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 @@ ogg_get_length (AVFormatContext * s)
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_get_length (AVFormatContext * s)
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 @@ static int
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 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
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 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
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 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
}
}
- 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{