Commit 7e3eaa59 authored by Max Kellermann's avatar Max Kellermann

lib/xiph/OggSyncState: keep track of the Reader offset

parent 6fe4068c
...@@ -40,8 +40,13 @@ OggSyncState::ExpectPage(ogg_page &page) ...@@ -40,8 +40,13 @@ OggSyncState::ExpectPage(ogg_page &page)
{ {
while (true) { while (true) {
int r = ogg_sync_pageout(&oy, &page); int r = ogg_sync_pageout(&oy, &page);
if (r != 0) if (r != 0) {
if (r > 0) {
start_offset = offset;
offset += r;
}
return r > 0; return r > 0;
}
if (!Feed(1024)) if (!Feed(1024))
return false; return false;
...@@ -66,12 +71,16 @@ OggSyncState::ExpectPageSeek(ogg_page &page) ...@@ -66,12 +71,16 @@ OggSyncState::ExpectPageSeek(ogg_page &page)
while (true) { while (true) {
int r = ogg_sync_pageseek(&oy, &page); int r = ogg_sync_pageseek(&oy, &page);
if (r > 0) if (r > 0) {
start_offset = offset;
offset += r;
return true; return true;
}
if (r < 0) { if (r < 0) {
/* skipped -r bytes */ /* skipped -r bytes */
size_t nbytes = -r; size_t nbytes = -r;
offset += nbytes;
if (nbytes > remaining_skipped) if (nbytes > remaining_skipped)
/* still no ogg page - we lost our /* still no ogg page - we lost our
patience, abort */ patience, abort */
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <ogg/ogg.h> #include <ogg/ogg.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
class Reader; class Reader;
...@@ -34,6 +35,17 @@ class OggSyncState { ...@@ -34,6 +35,17 @@ class OggSyncState {
Reader &reader; Reader &reader;
/**
* Keeps track of the end offset of the most recently returned
* page.
*/
uint64_t offset = 0;
/**
* The start offset of the most recently returned page.
*/
uint64_t start_offset = 0;
public: public:
explicit OggSyncState(Reader &_reader) explicit OggSyncState(Reader &_reader)
:reader(_reader) { :reader(_reader) {
...@@ -51,6 +63,14 @@ public: ...@@ -51,6 +63,14 @@ public:
ogg_sync_reset(&oy); ogg_sync_reset(&oy);
} }
void SetOffset(uint64_t _offset) noexcept {
offset = _offset;
}
uint64_t GetStartOffset() const noexcept {
return start_offset;
}
bool Feed(size_t size); bool Feed(size_t size);
bool ExpectPage(ogg_page &page); bool ExpectPage(ogg_page &page);
......
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