aboutsummaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
authorSven Hesse2010-08-08 00:57:27 +0000
committerSven Hesse2010-08-08 00:57:27 +0000
commitb13afba0536d16c3e37a2a887d582d9eeb42c8d1 (patch)
tree9403f027ddf51673b5a8c22762062a960c656547 /graphics
parent41f5d7812836f3c60532802780d93d5545b2258d (diff)
downloadscummvm-rg350-b13afba0536d16c3e37a2a887d582d9eeb42c8d1.tar.gz
scummvm-rg350-b13afba0536d16c3e37a2a887d582d9eeb42c8d1.tar.bz2
scummvm-rg350-b13afba0536d16c3e37a2a887d582d9eeb42c8d1.zip
VIDEO: Implement embedded file handling for VMDs
svn-id: r51899
Diffstat (limited to 'graphics')
-rw-r--r--graphics/video/coktel_decoder.cpp53
-rw-r--r--graphics/video/coktel_decoder.h7
2 files changed, 60 insertions, 0 deletions
diff --git a/graphics/video/coktel_decoder.cpp b/graphics/video/coktel_decoder.cpp
index fac32e55ff..864904f252 100644
--- a/graphics/video/coktel_decoder.cpp
+++ b/graphics/video/coktel_decoder.cpp
@@ -204,6 +204,10 @@ void CoktelDecoder::disableSound() {
_audioStream = 0;
}
+bool CoktelDecoder::hasEmbeddedFiles() const {
+ return false;
+}
+
bool CoktelDecoder::hasEmbeddedFile(const Common::String &fileName) const {
return false;
}
@@ -1814,6 +1818,55 @@ PixelFormat VMDDecoder::getPixelFormat() const {
return PixelFormat::createFormatCLUT8();
}
+bool VMDDecoder::hasEmbeddedFiles() const {
+ return !_files.empty();
+}
+
+bool VMDDecoder::hasEmbeddedFile(const Common::String &fileName) const {
+ for (Common::Array<File>::const_iterator file = _files.begin(); file != _files.end(); ++file)
+ if (!file->name.compareToIgnoreCase(fileName))
+ return true;
+
+ return false;
+}
+
+Common::MemoryReadStream *VMDDecoder::getEmbeddedFile(const Common::String &fileName) const {
+ const File *file = 0;
+
+ for (Common::Array<File>::const_iterator it = _files.begin(); it != _files.end(); ++it)
+ if (!it->name.compareToIgnoreCase(fileName)) {
+ file = &*it;
+ break;
+ }
+
+ if (!file)
+ return 0;
+
+ if ((file->size - 20) != file->realSize) {
+ warning("VMDDecoder::getEmbeddedFile(): Sizes for \"%s\" differ! (%d, %d)",
+ fileName.c_str(), (file->size - 20), file->realSize);
+ return 0;
+ }
+
+ if (!_stream->seek(file->offset)) {
+ warning("VMDDecoder::getEmbeddedFile(): Can't seek to offset %d to (file \"%s\")",
+ file->offset, fileName.c_str());
+ return 0;
+ }
+
+ byte *data = (byte *) malloc(file->realSize);
+ if (_stream->read(data, file->realSize) != file->realSize) {
+ free(data);
+ warning("VMDDecoder::getEmbeddedFile(): Couldn't read %d bytes (file \"%s\")",
+ file->realSize, fileName.c_str());
+ }
+
+ Common::MemoryReadStream *stream =
+ new Common::MemoryReadStream(data, file->realSize, DisposeAfterUse::YES);
+
+ return stream;
+}
+
} // End of namespace Graphics
#endif // GRAPHICS_VIDEO_COKTELDECODER_H
diff --git a/graphics/video/coktel_decoder.h b/graphics/video/coktel_decoder.h
index 1c4219edf7..442f2b4b5d 100644
--- a/graphics/video/coktel_decoder.h
+++ b/graphics/video/coktel_decoder.h
@@ -98,6 +98,9 @@ public:
void enableSound();
void disableSound();
+ /** Return whether that video has any embedded files. */
+ virtual bool hasEmbeddedFiles() const;
+
/** Return whether that embedded file exists. */
virtual bool hasEmbeddedFile(const Common::String &fileName) const;
@@ -336,6 +339,10 @@ public:
bool seek(int32 frame, int whence = SEEK_SET, bool restart = false);
+ bool hasEmbeddedFiles() const;
+ bool hasEmbeddedFile(const Common::String &fileName) const;
+ Common::MemoryReadStream *getEmbeddedFile(const Common::String &fileName) const;
+
// VideoDecoder interface