diff options
-rw-r--r-- | engines/agos/animation.cpp | 16 | ||||
-rw-r--r-- | engines/scumm/he/animation_he.cpp | 41 | ||||
-rw-r--r-- | engines/scumm/he/animation_he.h | 4 | ||||
-rw-r--r-- | engines/sword1/animation.cpp | 2 | ||||
-rw-r--r-- | engines/sword2/animation.cpp | 2 | ||||
-rw-r--r-- | graphics/dxa_player.cpp | 50 | ||||
-rw-r--r-- | graphics/dxa_player.h | 2 | ||||
-rw-r--r-- | graphics/module.mk | 1 | ||||
-rw-r--r-- | graphics/smk_player.cpp | 96 | ||||
-rw-r--r-- | graphics/smk_player.h | 7 |
10 files changed, 105 insertions, 116 deletions
diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp index c39e476d5e..328aa75acc 100644 --- a/engines/agos/animation.cpp +++ b/engines/agos/animation.cpp @@ -106,14 +106,14 @@ bool MoviePlayer::load(const char *filename) { void MoviePlayer::playOmniTV() { // Load OmniTV video - if (_fd) { + if (_fileStream) { _vm->setBitFlag(42, false); _omniTV = true; startSound(); } else { if (_omniTVFile) { // Restore state - _fd = _omniTVFile; + _fileStream = _omniTVFile; _mixer->pauseHandle(_omniTVSound, false); _vm->setBitFlag(42, false); @@ -175,14 +175,14 @@ void MoviePlayer::startSound() { byte *buffer; uint32 offset, size, tag; - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag == MKID_BE('WAVE')) { - size = _fd->readUint32BE(); + size = _fileStream->readUint32BE(); if (_sequenceNum) { Common::File in; - _fd->seek(size, SEEK_CUR); + _fileStream->seek(size, SEEK_CUR); in.open((const char *)"audio.wav"); if (!in.isOpen()) { @@ -199,7 +199,7 @@ void MoviePlayer::startSound() { in.close(); } else { buffer = (byte *)malloc(size); - _fd->read(buffer, size); + _fileStream->read(buffer, size); } Common::MemoryReadStream stream(buffer, size); @@ -226,10 +226,10 @@ void MoviePlayer::nextFrame() { if (_vm->getBitFlag(42)) { // Save state - _omniTVFile = _fd; + _omniTVFile = _fileStream; _mixer->pauseHandle(_omniTVSound, true); - _fd = 0; + _fileStream = 0; _omniTV = false; return; } diff --git a/engines/scumm/he/animation_he.cpp b/engines/scumm/he/animation_he.cpp index 24badd2685..3691f7cae1 100644 --- a/engines/scumm/he/animation_he.cpp +++ b/engines/scumm/he/animation_he.cpp @@ -33,59 +33,41 @@ namespace Scumm { MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer) - : DXAPlayer(), _vm(vm), _mixer(mixer) { + : SMKPlayer(), _vm(vm), _mixer(mixer) { _flags = 0; _wizResNum = 0; } int MoviePlayer::getImageNum() { - if (!_fd) + if (!_fileStream) return 0; return _wizResNum; } int MoviePlayer::load(const char *filename, int flags, int image) { - char videoName[100]; - - if (_fd) { + if (_fileStream) { closeFile(); } - int baseLen = strlen(filename) - 4; - memset(baseName, 0, sizeof(baseName)); - memcpy(baseName, filename, baseLen); - - // Change file extension to dxa - sprintf(videoName, "%s.dxa", baseName); - - if (!loadFile(videoName)) { - warning("Failed to load video file %s", videoName); + if (!loadFile(filename)) { + warning("Failed to load video file %s", filename); return -1; } - debug(1, "Playing video %s", videoName); - - // Skip sound tag - _fd->readUint32BE(); + debug(1, "Playing video %s", filename); if (flags & 2) { - _vm->_wiz->createWizEmptyImage(image, 0, 0, _width, _height); + _vm->_wiz->createWizEmptyImage(image, 0, 0, getWidth(), getHeight()); } _flags = flags; _wizResNum = image; - _bgSoundStream = Audio::AudioStream::openStreamFile(baseName); - if (_bgSoundStream != NULL) { - _mixer->stopHandle(_bgSound); - _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream); - } - return 0; } void MoviePlayer::handleNextFrame() { - if (_fd == false) { + if (_fileStream == false) { return; } @@ -102,16 +84,15 @@ void MoviePlayer::handleNextFrame() { } else if (_flags & 1) { copyFrameToBuffer(pvs->getBackPixels(0, 0), 0, 0, _vm->_screenWidth); - Common::Rect imageRect(_width, _height); + Common::Rect imageRect(getWidth(), getHeight()); _vm->restoreBackgroundHE(imageRect); } else { copyFrameToBuffer(pvs->getPixels(0, 0), 0, 0, _vm->_screenWidth); - _vm->markRectAsDirty(kMainVirtScreen, 0, 0, _width, _height); + _vm->markRectAsDirty(kMainVirtScreen, 0, 0, getWidth(), getHeight()); } - _frameNum++; - if (_frameNum == _framesCount) { + if (getCurFrame() == _framesCount) { closeFile(); } } diff --git a/engines/scumm/he/animation_he.h b/engines/scumm/he/animation_he.h index 1d04c3e5df..7516ce79a4 100644 --- a/engines/scumm/he/animation_he.h +++ b/engines/scumm/he/animation_he.h @@ -28,7 +28,7 @@ #include "common/file.h" -#include "graphics/dxa_player.h" +#include "graphics/smk_player.h" #include "sound/mixer.h" @@ -36,7 +36,7 @@ namespace Scumm { class ScummEngine_v90he; -class MoviePlayer : public Graphics::DXAPlayer { +class MoviePlayer : public Graphics::SMKPlayer { ScummEngine_v90he *_vm; Audio::Mixer *_mixer; diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index b621ab0f9c..578f4a8a81 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -409,7 +409,7 @@ bool MoviePlayerDXA::load(uint32 id) { snprintf(filename, sizeof(filename), "%s.dxa", sequenceList[id]); if (loadFile(filename)) { // The Broken Sword games always use external audio tracks. - if (_fd->readUint32BE() != MKID_BE('NULL')) + if (_fileStream->readUint32BE() != MKID_BE('NULL')) return false; _frameWidth = getWidth(); _frameHeight = getHeight(); diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 8c4faf4082..c195ba5b50 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -547,7 +547,7 @@ bool MoviePlayerDXA::load() { if (loadFile(filename)) { // The Broken Sword games always use external audio tracks. - if (_fd->readUint32BE() != MKID_BE('NULL')) + if (_fileStream->readUint32BE() != MKID_BE('NULL')) return false; _frameBuffer = _vm->_screen->getScreen(); diff --git a/graphics/dxa_player.cpp b/graphics/dxa_player.cpp index 21148be1d1..b0c3f498d7 100644 --- a/graphics/dxa_player.cpp +++ b/graphics/dxa_player.cpp @@ -35,7 +35,7 @@ namespace Graphics { DXAPlayer::DXAPlayer() { - _fd = 0; + _fileStream = 0; _frameBuffer1 = 0; _frameBuffer2 = 0; @@ -66,25 +66,25 @@ DXAPlayer::~DXAPlayer() { } int DXAPlayer::getWidth() { - if (!_fd) + if (!_fileStream) return 0; return _width; } int DXAPlayer::getHeight() { - if (!_fd) + if (!_fileStream) return 0; return _height; } int DXAPlayer::getCurFrame() { - if (!_fd) + if (!_fileStream) return -1; return _frameNum; } int DXAPlayer::getFrameCount() { - if (!_fd) + if (!_fileStream) return 0; return _framesCount; } @@ -99,14 +99,14 @@ bool DXAPlayer::loadFile(const char *filename) { return 0; } - _fd = file; + _fileStream = file; - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); assert(tag == MKID_BE('DEXA')); - uint8 flags = _fd->readByte(); - _framesCount = _fd->readUint16BE(); - frameRate = _fd->readUint32BE(); + uint8 flags = _fileStream->readByte(); + _framesCount = _fileStream->readUint16BE(); + frameRate = _fileStream->readUint32BE(); if (frameRate > 0) _framesPerSec = 1000 / frameRate; @@ -120,8 +120,8 @@ bool DXAPlayer::loadFile(const char *filename) { else _frameTicks = frameRate; - _width = _fd->readUint16BE(); - _height = _fd->readUint16BE(); + _width = _fileStream->readUint16BE(); + _height = _fileStream->readUint16BE(); if (flags & 0x80) { _scaleMode = S_INTERLACED; @@ -156,20 +156,20 @@ bool DXAPlayer::loadFile(const char *filename) { uint32 size; do { - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag != 0) { - size = _fd->readUint32BE(); + size = _fileStream->readUint32BE(); } switch (tag) { case 0: // No more tags break; case MKID_BE('MAXD'): assert(size == 4); - _decompBufferSize = _fd->readUint32BE(); + _decompBufferSize = _fileStream->readUint32BE(); break; default: // Unknown tag - skip it. while (size > 0) { - byte dummy = _fd->readByte(); + byte dummy = _fileStream->readByte(); size--; } break; @@ -184,10 +184,10 @@ bool DXAPlayer::loadFile(const char *filename) { } void DXAPlayer::closeFile() { - if (!_fd) + if (!_fileStream) return; - delete _fd; + delete _fileStream; free(_frameBuffer1); free(_frameBuffer2); @@ -195,7 +195,7 @@ void DXAPlayer::closeFile() { free(_inBuffer); free(_decompBuffer); - _fd = 0; + _fileStream = 0; _inBuffer = 0; _decompBuffer = 0; } @@ -513,18 +513,18 @@ void DXAPlayer::decode13(int size) { void DXAPlayer::decodeNextFrame() { uint32 tag; - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag == MKID_BE('CMAP')) { byte rgb[768]; - _fd->read(rgb, ARRAYSIZE(rgb)); + _fileStream->read(rgb, ARRAYSIZE(rgb)); setPalette(rgb); } - tag = _fd->readUint32BE(); + tag = _fileStream->readUint32BE(); if (tag == MKID_BE('FRAM')) { - byte type = _fd->readByte(); - uint32 size = _fd->readUint32BE(); + byte type = _fileStream->readByte(); + uint32 size = _fileStream->readUint32BE(); if ((_inBuffer == NULL) || (_inBufferSize < size)) { free(_inBuffer); _inBuffer = (byte *)malloc(size); @@ -533,7 +533,7 @@ void DXAPlayer::decodeNextFrame() { _inBufferSize = size; } - _fd->read(_inBuffer, size); + _fileStream->read(_inBuffer, size); switch (type) { case 2: diff --git a/graphics/dxa_player.h b/graphics/dxa_player.h index dbe39bbcee..27f4752d6a 100644 --- a/graphics/dxa_player.h +++ b/graphics/dxa_player.h @@ -61,7 +61,7 @@ public: DXAPlayer(); virtual ~DXAPlayer(); - Common::SeekableReadStream *_fd; + Common::SeekableReadStream *_fileStream; /** * Returns the width of the video diff --git a/graphics/module.mk b/graphics/module.mk index 70fb75fabe..f080a6555c 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS := \ primitives.o \ scaler.o \ scaler/thumbnail_intern.o \ + smk_player.o \ surface.o \ thumbnail.o \ VectorRenderer.o \ diff --git a/graphics/smk_player.cpp b/graphics/smk_player.cpp index 0ff29ea086..f6d38db48b 100644 --- a/graphics/smk_player.cpp +++ b/graphics/smk_player.cpp @@ -154,7 +154,7 @@ int SmallHuffmanTree::decodeTree(int length) { int r2 = decodeTree(length + 1); return r1+r2+1; -}; +} uint16 SmallHuffmanTree::getCode(BitStream &bs) { uint16 *p = &_tree[0]; @@ -235,7 +235,7 @@ BigHuffmanTree::BigHuffmanTree(BitStream &bs) delete _loBytes; delete _hiBytes; -}; +} void BigHuffmanTree::reset() { _tree[_last[0]] = _tree[_last[1]] = _tree[_last[2]] = 0; @@ -312,7 +312,7 @@ uint32 BigHuffmanTree::getCode(BitStream &bs) { } SMKPlayer::SMKPlayer() - : _currentSMKFrame(0) { + : _currentSMKFrame(0),_fileStream(0) { } SMKPlayer::~SMKPlayer() { @@ -322,49 +322,53 @@ SMKPlayer::~SMKPlayer() { bool SMKPlayer::loadFile(const char *fileName) { closeFile(); - if (!_fileStream.open(fileName)) { + Common::File *file = new Common::File(); + if (!file->open(fileName)) { + delete file; return false; } + _fileStream = file; + // Seek to the first frame _currentSMKFrame = 0; - _header.signature = _fileStream.readUint32BE(); + _header.signature = _fileStream->readUint32BE(); assert(_header.signature == MKID_BE('SMK2') || _header.signature == MKID_BE('SMK4')); - _header.width = _fileStream.readUint32LE(); - _header.height = _fileStream.readUint32LE(); - _header.frames = _fileStream.readUint32LE(); + _header.width = _fileStream->readUint32LE(); + _header.height = _fileStream->readUint32LE(); + _header.frames = _fileStream->readUint32LE(); _framesCount = _header.frames; - _header.frameRate = (int32)_fileStream.readUint32LE(); - _header.flags = _fileStream.readUint32LE(); + _header.frameRate = (int32)_fileStream->readUint32LE(); + _header.flags = _fileStream->readUint32LE(); unsigned int i; for (i = 0; i < 7; ++i) - _header.audioSize[i] = _fileStream.readUint32LE(); + _header.audioSize[i] = _fileStream->readUint32LE(); - _header.treesSize = _fileStream.readUint32LE(); - _header.mMapSize = _fileStream.readUint32LE(); - _header.mClrSize = _fileStream.readUint32LE(); - _header.fullSize = _fileStream.readUint32LE(); - _header.typeSize = _fileStream.readUint32LE(); + _header.treesSize = _fileStream->readUint32LE(); + _header.mMapSize = _fileStream->readUint32LE(); + _header.mClrSize = _fileStream->readUint32LE(); + _header.fullSize = _fileStream->readUint32LE(); + _header.typeSize = _fileStream->readUint32LE(); for (i = 0; i < 7; ++i) - _header.audioRate[i] = _fileStream.readUint32LE(); + _header.audioRate[i] = _fileStream->readUint32LE(); - _header.dummy = _fileStream.readUint32LE(); + _header.dummy = _fileStream->readUint32LE(); _frameSizes = (uint32 *)malloc(_header.frames * sizeof(uint32)); for (i = 0; i < _header.frames; ++i) - _frameSizes[i] = _fileStream.readUint32LE(); + _frameSizes[i] = _fileStream->readUint32LE(); _frameTypes = (uint32 *)malloc(_header.frames * sizeof(uint32)); for (i = 0; i < _header.frames; ++i) - _frameTypes[i] = _fileStream.readByte(); + _frameTypes[i] = _fileStream->readByte(); Common::Array<byte> huffmanTrees; huffmanTrees.resize(_header.treesSize + 2); - _fileStream.read(&huffmanTrees[0], _header.treesSize); + _fileStream->read(&huffmanTrees[0], _header.treesSize); BitStream bs(&huffmanTrees[0], _header.treesSize + 2); @@ -380,18 +384,20 @@ bool SMKPlayer::loadFile(const char *fileName) { } void SMKPlayer::closeFile() { - if (_fileStream.isOpen()) { - delete _MMapTree; - delete _MClrTree; - delete _FullTree; - delete _TypeTree; - - free(_frameSizes); - free(_frameTypes); - free(_image); - free(_palette); - } - _fileStream.close(); + if (!_fileStream) + return; + + delete _MMapTree; + delete _MClrTree; + delete _FullTree; + delete _TypeTree; + + free(_frameSizes); + free(_frameTypes); + free(_image); + free(_palette); + + _fileStream = 0; } void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { @@ -411,7 +417,7 @@ void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { bool SMKPlayer::decodeNextFrame() { uint i; - uint32 startPos = _fileStream.pos(); + uint32 startPos = _fileStream->pos(); _paletteDidChange = false; if (_frameTypes[_currentSMKFrame] & 1) { @@ -426,20 +432,20 @@ bool SMKPlayer::decodeNextFrame() { if (!(_frameTypes[_currentSMKFrame] & (2 << i))) continue; - uint32 len = _fileStream.readUint32LE(); - //uint32 unpackedLen = _fileStream.readUint32LE(); - _fileStream.skip(len - 4); + uint32 len = _fileStream->readUint32LE(); + //uint32 unpackedLen = _fileStream->readUint32LE(); + _fileStream->skip(len - 4); } uint32 frameSize = _frameSizes[_currentSMKFrame] & ~3; - if (_fileStream.pos() - startPos > frameSize) + if (_fileStream->pos() - startPos > frameSize) exit(1); - uint32 frameDataSize = frameSize - (_fileStream.pos() - startPos); + uint32 frameDataSize = frameSize - (_fileStream->pos() - startPos); _frameData = (byte *)malloc(frameDataSize + 2); - _fileStream.read(_frameData, frameDataSize); + _fileStream->read(_frameData, frameDataSize); BitStream bs(_frameData, frameDataSize + 2); @@ -590,7 +596,7 @@ bool SMKPlayer::decodeNextFrame() { } } - _fileStream.seek(startPos + frameSize); + _fileStream->seek(startPos + frameSize); free(_frameData); @@ -598,11 +604,11 @@ bool SMKPlayer::decodeNextFrame() { } void SMKPlayer::unpackPalette() { - uint startPos = _fileStream.pos(); - uint32 len = 4 * _fileStream.readByte(); + uint startPos = _fileStream->pos(); + uint32 len = 4 * _fileStream->readByte(); byte *chunk = (byte *)malloc(len); - _fileStream.read(&chunk[0], len); + _fileStream->read(&chunk[0], len); byte *p = &chunk[0]; byte oldPalette[3*256]; @@ -642,7 +648,7 @@ void SMKPlayer::unpackPalette() { } } - _fileStream.seek(startPos + len); + _fileStream->seek(startPos + len); free(chunk); } diff --git a/graphics/smk_player.h b/graphics/smk_player.h index 38023b18d4..e230a958bd 100644 --- a/graphics/smk_player.h +++ b/graphics/smk_player.h @@ -50,7 +50,9 @@ class BigHuffmanTree; class SMKPlayer { public: SMKPlayer(); - ~SMKPlayer(); + virtual ~SMKPlayer(); + + Common::SeekableReadStream *_fileStream; /** * Returns the width of the video @@ -68,7 +70,7 @@ public: * Returns the current frame number of the video * @return the current frame number of the video */ - uint32 getCurrentFrame() { return _currentSMKFrame; } + uint32 getCurFrame() { return _currentSMKFrame; } /** * Returns the amount of frames in the video @@ -124,7 +126,6 @@ protected: private: void unpackPalette(); - Common::File _fileStream; uint32 _currentSMKFrame; struct { |