From de368ade4a0ca9240ec560b8185feb4b1e0149a2 Mon Sep 17 00:00:00 2001 From: Miku AuahDark Date: Tue, 21 Sep 2021 22:52:50 +0800 Subject: [PATCH] Break OggDemuxer::readPage loop on EOF. --- src/modules/video/theora/OggDemuxer.cpp | 19 ++++++++++++++----- src/modules/video/theora/OggDemuxer.h | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/modules/video/theora/OggDemuxer.cpp b/src/modules/video/theora/OggDemuxer.cpp index f5a14d936..acc6f9849 100644 --- a/src/modules/video/theora/OggDemuxer.cpp +++ b/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; diff --git a/src/modules/video/theora/OggDemuxer.h b/src/modules/video/theora/OggDemuxer.h index a6b2de900..f55a352d2 100644 --- a/src/modules/video/theora/OggDemuxer.h +++ b/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