|
@@ -43,7 +43,7 @@ OggDemuxer::~OggDemuxer()
|
|
|
ogg_sync_clear(&sync);
|
|
|
}
|
|
|
|
|
|
-void OggDemuxer::readPage()
|
|
|
+void OggDemuxer::readPage(bool throweof)
|
|
|
{
|
|
|
char *syncBuffer = nullptr;
|
|
|
while (ogg_sync_pageout(&sync, &page) != 1)
|
|
@@ -53,6 +53,9 @@ void OggDemuxer::readPage()
|
|
|
|
|
|
syncBuffer = ogg_sync_buffer(&sync, 8192);
|
|
|
size_t read = file->read(syncBuffer, 8192);
|
|
|
+ if (read == 0 && throweof)
|
|
|
+ throw love::Exception("Invalid stream");
|
|
|
+
|
|
|
ogg_sync_wrote(&sync, read);
|
|
|
}
|
|
|
}
|
|
@@ -118,22 +121,23 @@ OggDemuxer::StreamType OggDemuxer::findStream()
|
|
|
if (streamInited)
|
|
|
{
|
|
|
eos = false;
|
|
|
+ streamInited = false;
|
|
|
file->seek(0);
|
|
|
ogg_stream_clear(&stream);
|
|
|
ogg_sync_reset(&sync);
|
|
|
}
|
|
|
|
|
|
- streamInited = true;
|
|
|
while (true)
|
|
|
{
|
|
|
// If this page isn't at the start of a stream, we've seen all streams
|
|
|
- readPage();
|
|
|
+ readPage(true);
|
|
|
if (!ogg_page_bos(&page))
|
|
|
break;
|
|
|
|
|
|
videoSerial = ogg_page_serialno(&page);
|
|
|
ogg_stream_init(&stream, videoSerial);
|
|
|
ogg_stream_pagein(&stream, &page);
|
|
|
+ streamInited = true;
|
|
|
|
|
|
StreamType type = determineType();
|
|
|
switch(type)
|
|
@@ -145,10 +149,15 @@ OggDemuxer::StreamType OggDemuxer::findStream()
|
|
|
}
|
|
|
|
|
|
ogg_stream_clear(&stream);
|
|
|
+ streamInited = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (streamInited)
|
|
|
+ {
|
|
|
+ streamInited = false;
|
|
|
+ ogg_stream_clear(&stream);
|
|
|
}
|
|
|
|
|
|
- streamInited = false;
|
|
|
- ogg_stream_clear(&stream);
|
|
|
ogg_sync_reset(&sync);
|
|
|
|
|
|
return TYPE_UNKNOWN;
|