Browse Source

Merge pull request #1729 from MikuAuahDark/fix1728

Break OggDemuxer::readPage loop on EOF.
Alex Szpakowski 3 years ago
parent
commit
ff12dbbd69
2 changed files with 15 additions and 6 deletions
  1. 14 5
      src/modules/video/theora/OggDemuxer.cpp
  2. 1 1
      src/modules/video/theora/OggDemuxer.h

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

@@ -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;

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

@@ -67,7 +67,7 @@ private:
 	int videoSerial;
 	bool eos;
 
-	void readPage();
+	void readPage(bool throweof = false);
 	StreamType determineType();
 }; // OggDemuxer