Fixes for video files that do not have the video as first stream, and better EOS detection

--HG--
branch : minor
This commit is contained in:
Bart van Strien
2017-10-12 15:11:15 +02:00
parent 0e9f71b29a
commit 52ae68b288
2 changed files with 10 additions and 5 deletions
+9 -5
View File
@@ -31,6 +31,7 @@ OggDemuxer::OggDemuxer(love::filesystem::File *file)
: file(file)
, streamInited(false)
, videoSerial(0)
, eos(false)
{
ogg_sync_init(&sync);
}
@@ -66,8 +67,8 @@ bool OggDemuxer::readPacket(ogg_packet &packet, bool mustSucceed)
do
{
// We need to read another page, but there is none, we're at the end
if (ogg_page_eos(&page) && !mustSucceed)
return true;
if (ogg_page_serialno(&page) == videoSerial && ogg_page_eos(&page) && !mustSucceed)
return eos = true;
readPage();
} while (ogg_page_serialno(&page) != videoSerial);
@@ -75,7 +76,7 @@ bool OggDemuxer::readPacket(ogg_packet &packet, bool mustSucceed)
ogg_stream_pagein(&stream, &page);
}
return false;
return eos = false;
}
void OggDemuxer::resync()
@@ -87,7 +88,7 @@ void OggDemuxer::resync()
bool OggDemuxer::isEos() const
{
return ogg_page_eos(&page);
return eos;
}
const std::string &OggDemuxer::getFilename() const
@@ -116,6 +117,7 @@ OggDemuxer::StreamType OggDemuxer::findStream()
{
if (streamInited)
{
eos = false;
file->seek(0);
ogg_stream_clear(&stream);
ogg_sync_reset(&sync);
@@ -143,7 +145,6 @@ OggDemuxer::StreamType OggDemuxer::findStream()
}
ogg_stream_clear(&stream);
ogg_sync_reset(&sync);
}
streamInited = false;
@@ -157,6 +158,8 @@ bool OggDemuxer::seek(ogg_packet &packet, double target, std::function<double(in
{
static const double rewindThreshold = 0.01;
eos = false;
if (target < rewindThreshold)
{
file->seek(0);
@@ -185,6 +188,7 @@ bool OggDemuxer::seek(ogg_packet &packet, double target, std::function<double(in
// EOS, so we're definitely past our target (or the target is past
// the end)
high = pos;
eos = false;
// And a workaround for single-page files:
if (high < rewindThreshold)
+1
View File
@@ -65,6 +65,7 @@ private:
bool streamInited;
int videoSerial;
bool eos;
void readPage();
StreamType determineType();