Commit 97b164d0 authored by Max Kellermann's avatar Max Kellermann

decoder/OggUtil: add OggExpectPageSeek()

parent 61e7e531
......@@ -76,3 +76,43 @@ OggExpectPageIn(ogg_sync_state &oy, ogg_stream_state &os,
ogg_stream_pagein(&os, &page);
return true;
}
bool
OggExpectPageSeek(ogg_sync_state &oy, ogg_page &page,
decoder *decoder, input_stream *input_stream)
{
size_t remaining_skipped = 16384;
while (true) {
int r = ogg_sync_pageseek(&oy, &page);
if (r > 0)
return true;
if (r < 0) {
/* skipped -r bytes */
size_t nbytes = -r;
if (nbytes > remaining_skipped)
/* still no ogg page - we lost our
patience, abort */
return false;
remaining_skipped -= nbytes;
continue;
}
if (!OggFeed(oy, decoder, input_stream, 1024))
return false;
}
}
bool
OggExpectPageSeekIn(ogg_sync_state &oy, ogg_stream_state &os,
decoder *decoder, input_stream *is)
{
ogg_page page;
if (!OggExpectPageSeek(oy, page, decoder, is))
return false;
ogg_stream_pagein(&os, &page);
return true;
}
......@@ -68,4 +68,20 @@ bool
OggExpectPageIn(ogg_sync_state &oy, ogg_stream_state &os,
decoder *decoder, input_stream *is);
/**
* Like OggExpectPage(), but allow skipping garbage (after seeking).
*/
bool
OggExpectPageSeek(ogg_sync_state &oy, ogg_page &page,
decoder *decoder, input_stream *input_stream);
/**
* Combines OggExpectPageSeek() and ogg_stream_pagein().
*
* @return true if a page was delivered to the stream
*/
bool
OggExpectPageSeekIn(ogg_sync_state &oy, ogg_stream_state &os,
decoder *decoder, input_stream *is);
#endif
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