diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 30583c495d..eec45380bb 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -101,6 +101,7 @@ static int ogg_restore(AVFormatContext *s, int discard) av_free(ogg->streams[i].buf); avio_seek(bc, ost->pos, SEEK_SET); + ogg->page_pos = -1; ogg->curidx = ost->curidx; ogg->nstreams = ost->nstreams; ogg->streams = av_realloc(ogg->streams, @@ -145,6 +146,7 @@ static int ogg_reset(AVFormatContext *s) } } + ogg->page_pos = -1; ogg->curidx = -1; return 0; @@ -296,6 +298,12 @@ static int ogg_read_page(AVFormatContext *s, int *sid) sync[(sp + 2) & 3] == 'g' && sync[(sp + 3) & 3] == 'S') break; + if(!i && bc->seekable && ogg->page_pos > 0) { + memset(sync, 0, 4); + avio_seek(bc, ogg->page_pos+4, SEEK_SET); + ogg->page_pos = -1; + } + c = avio_r8(bc); if (url_feof(bc)) @@ -334,6 +342,7 @@ static int ogg_read_page(AVFormatContext *s, int *sid) } os = ogg->streams + idx; + ogg->page_pos = os->page_pos = avio_tell(bc) - 27; if (os->psize > 0) @@ -558,6 +567,7 @@ static int ogg_get_length(AVFormatContext *s) ogg_save(s); avio_seek(s->pb, end, SEEK_SET); + ogg->page_pos = -1; while (!ogg_read_page(s, &i)) { if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 && diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h index 2a22946099..e9a300dd9e 100644 --- a/libavformat/oggdec.h +++ b/libavformat/oggdec.h @@ -100,6 +100,7 @@ struct ogg { int nstreams; int headers; int curidx; + int64_t page_pos; ///< file offset of the current page struct ogg_state *state; };