mirror of https://git.ffmpeg.org/ffmpeg.git
oggdec: resync from the last page.
Previously we re synced from where we where which cam lead to loosing pages. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
778069c832
commit
c5cf58d4b9
|
@ -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 &&
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue