Browse Source

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

--HG--
branch : minor
Bart van Strien 7 years ago
parent
commit
52ae68b288
2 changed files with 10 additions and 5 deletions
  1. 9 5
      src/modules/video/theora/OggDemuxer.cpp
  2. 1 0
      src/modules/video/theora/OggDemuxer.h

+ 9 - 5
src/modules/video/theora/OggDemuxer.cpp

@@ -31,6 +31,7 @@ OggDemuxer::OggDemuxer(love::filesystem::File *file)
 	: file(file)
 	: file(file)
 	, streamInited(false)
 	, streamInited(false)
 	, videoSerial(0)
 	, videoSerial(0)
+	, eos(false)
 {
 {
 	ogg_sync_init(&sync);
 	ogg_sync_init(&sync);
 }
 }
@@ -66,8 +67,8 @@ bool OggDemuxer::readPacket(ogg_packet &packet, bool mustSucceed)
 		do
 		do
 		{
 		{
 			// We need to read another page, but there is none, we're at the end
 			// 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();
 			readPage();
 		} while (ogg_page_serialno(&page) != videoSerial);
 		} while (ogg_page_serialno(&page) != videoSerial);
@@ -75,7 +76,7 @@ bool OggDemuxer::readPacket(ogg_packet &packet, bool mustSucceed)
 		ogg_stream_pagein(&stream, &page);
 		ogg_stream_pagein(&stream, &page);
 	}
 	}
 
 
-	return false;
+	return eos = false;
 }
 }
 
 
 void OggDemuxer::resync()
 void OggDemuxer::resync()
@@ -87,7 +88,7 @@ void OggDemuxer::resync()
 
 
 bool OggDemuxer::isEos() const
 bool OggDemuxer::isEos() const
 {
 {
-	return ogg_page_eos(&page);
+	return eos;
 }
 }
 
 
 const std::string &OggDemuxer::getFilename() const
 const std::string &OggDemuxer::getFilename() const
@@ -116,6 +117,7 @@ OggDemuxer::StreamType OggDemuxer::findStream()
 {
 {
 	if (streamInited)
 	if (streamInited)
 	{
 	{
+		eos = false;
 		file->seek(0);
 		file->seek(0);
 		ogg_stream_clear(&stream);
 		ogg_stream_clear(&stream);
 		ogg_sync_reset(&sync);
 		ogg_sync_reset(&sync);
@@ -143,7 +145,6 @@ OggDemuxer::StreamType OggDemuxer::findStream()
 		}
 		}
 
 
 		ogg_stream_clear(&stream);
 		ogg_stream_clear(&stream);
-		ogg_sync_reset(&sync);
 	}
 	}
 
 
 	streamInited = false;
 	streamInited = false;
@@ -157,6 +158,8 @@ bool OggDemuxer::seek(ogg_packet &packet, double target, std::function<double(in
 {
 {
 	static const double rewindThreshold = 0.01;
 	static const double rewindThreshold = 0.01;
 
 
+	eos = false;
+
 	if (target < rewindThreshold)
 	if (target < rewindThreshold)
 	{
 	{
 		file->seek(0);
 		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
 			// EOS, so we're definitely past our target (or the target is past
 			// the end)
 			// the end)
 			high = pos;
 			high = pos;
+			eos = false;
 
 
 			// And a workaround for single-page files:
 			// And a workaround for single-page files:
 			if (high < rewindThreshold)
 			if (high < rewindThreshold)

+ 1 - 0
src/modules/video/theora/OggDemuxer.h

@@ -65,6 +65,7 @@ private:
 
 
 	bool streamInited;
 	bool streamInited;
 	int videoSerial;
 	int videoSerial;
+	bool eos;
 
 
 	void readPage();
 	void readPage();
 	StreamType determineType();
 	StreamType determineType();