From faee277978c54ccb3dcccfedc75ddb31f44e630f Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 8 Apr 2011 17:04:29 -0400 Subject: COMMON: Add a DisposeAfterUse flag to QuickTimeParser --- audio/decoders/quicktime.cpp | 29 ++++++++++++++++++++++------- audio/decoders/quicktime.h | 14 ++++++++++++-- common/quicktime.cpp | 13 +++++++++---- common/quicktime.h | 7 +++++-- video/qt_decoder.cpp | 4 ++-- 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/audio/decoders/quicktime.cpp b/audio/decoders/quicktime.cpp index 53cce30125..62a6f6e404 100644 --- a/audio/decoders/quicktime.cpp +++ b/audio/decoders/quicktime.cpp @@ -46,16 +46,16 @@ QuickTimeAudioDecoder::~QuickTimeAudioDecoder() { delete _audStream; } -bool QuickTimeAudioDecoder::loadFile(const Common::String &filename) { - if (!Common::QuickTimeParser::loadFile(filename)) +bool QuickTimeAudioDecoder::loadAudioFile(const Common::String &filename) { + if (!Common::QuickTimeParser::parseFile(filename)) return false; init(); return true; } -bool QuickTimeAudioDecoder::loadStream(Common::SeekableReadStream *stream) { - if (!Common::QuickTimeParser::loadStream(stream)) +bool QuickTimeAudioDecoder::loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { + if (!Common::QuickTimeParser::parseStream(stream, disposeFileHandle)) return false; init(); @@ -319,8 +319,12 @@ public: QuickTimeAudioStream() {} ~QuickTimeAudioStream() {} - bool loadFile(const Common::String &filename) { - return QuickTimeAudioDecoder::loadFile(filename) && _audioStreamIndex >= 0 && _audStream; + bool openFromFile(const Common::String &filename) { + return QuickTimeAudioDecoder::loadAudioFile(filename) && _audioStreamIndex >= 0 && _audStream; + } + + bool openFromStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { + return QuickTimeAudioDecoder::loadAudioStream(stream, disposeFileHandle) && _audioStreamIndex >= 0 && _audStream; } // AudioStream API @@ -358,7 +362,18 @@ public: SeekableAudioStream *makeQuickTimeStream(const Common::String &filename) { QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); - if (!audioStream->loadFile(filename)) { + if (!audioStream->openFromFile(filename)) { + delete audioStream; + return 0; + } + + return audioStream; +} + +SeekableAudioStream *makeQuickTimeStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) { + QuickTimeAudioStream *audioStream = new QuickTimeAudioStream(); + + if (!audioStream->openFromStream(stream, disposeAfterUse)) { delete audioStream; return 0; } diff --git a/audio/decoders/quicktime.h b/audio/decoders/quicktime.h index 9e2e95b705..be4d1097da 100644 --- a/audio/decoders/quicktime.h +++ b/audio/decoders/quicktime.h @@ -50,13 +50,13 @@ public: * Load a QuickTime audio file * @param filename the filename to load */ - bool loadFile(const Common::String &filename); + bool loadAudioFile(const Common::String &filename); /** * Load a QuickTime audio file from a SeekableReadStream * @param stream the stream to load */ - bool loadStream(Common::SeekableReadStream *stream); + bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle); protected: struct AudioSampleDesc : public Common::QuickTimeParser::SampleDesc { @@ -93,6 +93,16 @@ protected: */ SeekableAudioStream *makeQuickTimeStream(const Common::String &filename); +/** + * Try to load a QuickTime sound file from the given seekable stream and create a SeekableAudioStream + * from that data. + * + * @param stream the SeekableReadStream from which to read the data + * @param disposeAfterUse whether to delete the stream after use + * @return a new SeekableAudioStream, or NULL, if an error occurred + */ +SeekableAudioStream *makeQuickTimeStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES); + } // End of namespace Audio #endif diff --git a/common/quicktime.cpp b/common/quicktime.cpp index d40f279f15..fe48cfdcb1 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -52,6 +52,7 @@ QuickTimeParser::QuickTimeParser() { _scaleFactorX = 1; _scaleFactorY = 1; _resFork = new Common::MacResManager(); + _disposeFileHandle = DisposeAfterUse::YES; initParseTable(); } @@ -61,12 +62,13 @@ QuickTimeParser::~QuickTimeParser() { delete _resFork; } -bool QuickTimeParser::loadFile(const Common::String &filename) { +bool QuickTimeParser::parseFile(const Common::String &filename) { if (!_resFork->open(filename) || !_resFork->hasDataFork()) return false; _foundMOOV = false; _numStreams = 0; + _disposeFileHandle = DisposeAfterUse::YES; MOVatom atom = { 0, 0, 0xffffffff }; @@ -98,15 +100,16 @@ bool QuickTimeParser::loadFile(const Common::String &filename) { return true; } -bool QuickTimeParser::loadStream(Common::SeekableReadStream *stream) { +bool QuickTimeParser::parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle) { _fd = stream; _foundMOOV = false; _numStreams = 0; + _disposeFileHandle = disposeFileHandle; MOVatom atom = { 0, 0, 0xffffffff }; if (readDefault(atom) < 0 || !_foundMOOV) { - _fd = 0; + close(); return false; } @@ -724,7 +727,9 @@ void QuickTimeParser::close() { _numStreams = 0; - delete _fd; + if (_disposeFileHandle == DisposeAfterUse::YES) + delete _fd; + _fd = 0; } diff --git a/common/quicktime.h b/common/quicktime.h index 7770860507..42b48bbb94 100644 --- a/common/quicktime.h +++ b/common/quicktime.h @@ -58,13 +58,14 @@ public: * Load a QuickTime file * @param filename the filename to load */ - bool loadFile(const Common::String &filename); + bool parseFile(const Common::String &filename); /** * Load a QuickTime file from a SeekableReadStream * @param stream the stream to load + * @param disposeFileHandle whether to delete the stream after use */ - bool loadStream(Common::SeekableReadStream *stream); + bool parseStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle = DisposeAfterUse::YES); /** * Close a QuickTime file @@ -84,6 +85,8 @@ protected: // This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream. Common::SeekableReadStream *_fd; + DisposeAfterUse::Flag _disposeFileHandle; + struct MOVatom { uint32 type; uint32 offset; diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp index de4a284ec9..414073bccc 100644 --- a/video/qt_decoder.cpp +++ b/video/qt_decoder.cpp @@ -344,7 +344,7 @@ uint32 QuickTimeDecoder::getTimeToNextFrame() const { } bool QuickTimeDecoder::loadFile(const Common::String &filename) { - if (!Common::QuickTimeParser::loadFile(filename)) + if (!Common::QuickTimeParser::parseFile(filename)) return false; init(); @@ -352,7 +352,7 @@ bool QuickTimeDecoder::loadFile(const Common::String &filename) { } bool QuickTimeDecoder::loadStream(Common::SeekableReadStream *stream) { - if (!Common::QuickTimeParser::loadStream(stream)) + if (!Common::QuickTimeParser::parseStream(stream)) return false; init(); -- cgit v1.2.3