Commit 56466d7b authored by Måns Rullgård's avatar Måns Rullgård

fix seek related bugs

Originally committed as revision 5453 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 0d18f798
...@@ -449,6 +449,7 @@ ogg_get_length (AVFormatContext * s) ...@@ -449,6 +449,7 @@ ogg_get_length (AVFormatContext * s)
{ {
ogg_t *ogg = s->priv_data; ogg_t *ogg = s->priv_data;
int idx = -1, i; int idx = -1, i;
offset_t size, end;
if(s->pb.is_streamed) if(s->pb.is_streamed)
return 0; return 0;
...@@ -457,8 +458,13 @@ ogg_get_length (AVFormatContext * s) ...@@ -457,8 +458,13 @@ ogg_get_length (AVFormatContext * s)
if (s->duration != AV_NOPTS_VALUE) if (s->duration != AV_NOPTS_VALUE)
return 0; 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); 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)){ while (!ogg_read_page (s, &i)){
if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0) if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0)
...@@ -470,7 +476,7 @@ ogg_get_length (AVFormatContext * s) ...@@ -470,7 +476,7 @@ ogg_get_length (AVFormatContext * s)
ogg_gptopts (s, idx, ogg->streams[idx].granule); ogg_gptopts (s, idx, ogg->streams[idx].granule);
} }
ogg->size = url_fsize(&s->pb); ogg->size = size;
ogg_restore (s, 0); ogg_restore (s, 0);
return 0; return 0;
...@@ -547,10 +553,11 @@ static int ...@@ -547,10 +553,11 @@ static int
ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts, ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
int flags) int flags)
{ {
AVStream *st = s->streams[stream_index];
ogg_t *ogg = s->priv_data; ogg_t *ogg = s->priv_data;
ByteIOContext *bc = &s->pb; ByteIOContext *bc = &s->pb;
uint64_t min = 0, max = ogg->size; 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; int64_t pts = AV_NOPTS_VALUE;
ogg_save (s); ogg_save (s);
...@@ -562,7 +569,8 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts, ...@@ -562,7 +569,8 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts,
url_fseek (bc, p, SEEK_SET); url_fseek (bc, p, SEEK_SET);
while (!ogg_read_page (s, &i)){ 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; break;
} }
...@@ -572,7 +580,7 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t target_ts, ...@@ -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); pts = ogg_gptopts (s, i, ogg->streams[i].granule);
p = url_ftell (bc); p = url_ftell (bc);
if (ABS (pts - target_ts) < 1000000LL) if (ABS (pts - target_ts) * st->time_base.num < st->time_base.den)
break; break;
if (pts > target_ts){ if (pts > target_ts){
...@@ -584,7 +592,7 @@ ogg_read_seek (AVFormatContext * s, int stream_index, int64_t 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_restore (s, 1);
ogg_reset (ogg); ogg_reset (ogg);
}else{ }else{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment