Enable Smacker support, and switch later HE games to Smacker support (since they aren't supported yet).

svn-id: r35368
This commit is contained in:
Travis Howell 2008-12-14 23:41:48 +00:00
parent 41499091b0
commit 9c20a533bb
10 changed files with 104 additions and 115 deletions

View file

@ -106,14 +106,14 @@ bool MoviePlayer::load(const char *filename) {
void MoviePlayer::playOmniTV() { void MoviePlayer::playOmniTV() {
// Load OmniTV video // Load OmniTV video
if (_fd) { if (_fileStream) {
_vm->setBitFlag(42, false); _vm->setBitFlag(42, false);
_omniTV = true; _omniTV = true;
startSound(); startSound();
} else { } else {
if (_omniTVFile) { if (_omniTVFile) {
// Restore state // Restore state
_fd = _omniTVFile; _fileStream = _omniTVFile;
_mixer->pauseHandle(_omniTVSound, false); _mixer->pauseHandle(_omniTVSound, false);
_vm->setBitFlag(42, false); _vm->setBitFlag(42, false);
@ -175,14 +175,14 @@ void MoviePlayer::startSound() {
byte *buffer; byte *buffer;
uint32 offset, size, tag; uint32 offset, size, tag;
tag = _fd->readUint32BE(); tag = _fileStream->readUint32BE();
if (tag == MKID_BE('WAVE')) { if (tag == MKID_BE('WAVE')) {
size = _fd->readUint32BE(); size = _fileStream->readUint32BE();
if (_sequenceNum) { if (_sequenceNum) {
Common::File in; Common::File in;
_fd->seek(size, SEEK_CUR); _fileStream->seek(size, SEEK_CUR);
in.open((const char *)"audio.wav"); in.open((const char *)"audio.wav");
if (!in.isOpen()) { if (!in.isOpen()) {
@ -199,7 +199,7 @@ void MoviePlayer::startSound() {
in.close(); in.close();
} else { } else {
buffer = (byte *)malloc(size); buffer = (byte *)malloc(size);
_fd->read(buffer, size); _fileStream->read(buffer, size);
} }
Common::MemoryReadStream stream(buffer, size); Common::MemoryReadStream stream(buffer, size);
@ -226,10 +226,10 @@ void MoviePlayer::nextFrame() {
if (_vm->getBitFlag(42)) { if (_vm->getBitFlag(42)) {
// Save state // Save state
_omniTVFile = _fd; _omniTVFile = _fileStream;
_mixer->pauseHandle(_omniTVSound, true); _mixer->pauseHandle(_omniTVSound, true);
_fd = 0; _fileStream = 0;
_omniTV = false; _omniTV = false;
return; return;
} }

View file

@ -33,59 +33,41 @@
namespace Scumm { namespace Scumm {
MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer) MoviePlayer::MoviePlayer(ScummEngine_v90he *vm, Audio::Mixer *mixer)
: DXAPlayer(), _vm(vm), _mixer(mixer) { : SMKPlayer(), _vm(vm), _mixer(mixer) {
_flags = 0; _flags = 0;
_wizResNum = 0; _wizResNum = 0;
} }
int MoviePlayer::getImageNum() { int MoviePlayer::getImageNum() {
if (!_fd) if (!_fileStream)
return 0; return 0;
return _wizResNum; return _wizResNum;
} }
int MoviePlayer::load(const char *filename, int flags, int image) { int MoviePlayer::load(const char *filename, int flags, int image) {
char videoName[100]; if (_fileStream) {
if (_fd) {
closeFile(); closeFile();
} }
int baseLen = strlen(filename) - 4; if (!loadFile(filename)) {
memset(baseName, 0, sizeof(baseName)); warning("Failed to load video file %s", filename);
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);
return -1; return -1;
} }
debug(1, "Playing video %s", videoName); debug(1, "Playing video %s", filename);
// Skip sound tag
_fd->readUint32BE();
if (flags & 2) { if (flags & 2) {
_vm->_wiz->createWizEmptyImage(image, 0, 0, _width, _height); _vm->_wiz->createWizEmptyImage(image, 0, 0, getWidth(), getHeight());
} }
_flags = flags; _flags = flags;
_wizResNum = image; _wizResNum = image;
_bgSoundStream = Audio::AudioStream::openStreamFile(baseName);
if (_bgSoundStream != NULL) {
_mixer->stopHandle(_bgSound);
_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream);
}
return 0; return 0;
} }
void MoviePlayer::handleNextFrame() { void MoviePlayer::handleNextFrame() {
if (_fd == false) { if (_fileStream == false) {
return; return;
} }
@ -102,16 +84,15 @@ void MoviePlayer::handleNextFrame() {
} else if (_flags & 1) { } else if (_flags & 1) {
copyFrameToBuffer(pvs->getBackPixels(0, 0), 0, 0, _vm->_screenWidth); copyFrameToBuffer(pvs->getBackPixels(0, 0), 0, 0, _vm->_screenWidth);
Common::Rect imageRect(_width, _height); Common::Rect imageRect(getWidth(), getHeight());
_vm->restoreBackgroundHE(imageRect); _vm->restoreBackgroundHE(imageRect);
} else { } else {
copyFrameToBuffer(pvs->getPixels(0, 0), 0, 0, _vm->_screenWidth); 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 (getCurFrame() == _framesCount) {
if (_frameNum == _framesCount) {
closeFile(); closeFile();
} }
} }

View file

@ -28,7 +28,7 @@
#include "common/file.h" #include "common/file.h"
#include "graphics/dxa_player.h" #include "graphics/smk_player.h"
#include "sound/mixer.h" #include "sound/mixer.h"
@ -36,7 +36,7 @@ namespace Scumm {
class ScummEngine_v90he; class ScummEngine_v90he;
class MoviePlayer : public Graphics::DXAPlayer { class MoviePlayer : public Graphics::SMKPlayer {
ScummEngine_v90he *_vm; ScummEngine_v90he *_vm;
Audio::Mixer *_mixer; Audio::Mixer *_mixer;

View file

@ -409,7 +409,7 @@ bool MoviePlayerDXA::load(uint32 id) {
snprintf(filename, sizeof(filename), "%s.dxa", sequenceList[id]); snprintf(filename, sizeof(filename), "%s.dxa", sequenceList[id]);
if (loadFile(filename)) { if (loadFile(filename)) {
// The Broken Sword games always use external audio tracks. // The Broken Sword games always use external audio tracks.
if (_fd->readUint32BE() != MKID_BE('NULL')) if (_fileStream->readUint32BE() != MKID_BE('NULL'))
return false; return false;
_frameWidth = getWidth(); _frameWidth = getWidth();
_frameHeight = getHeight(); _frameHeight = getHeight();

View file

@ -547,7 +547,7 @@ bool MoviePlayerDXA::load() {
if (loadFile(filename)) { if (loadFile(filename)) {
// The Broken Sword games always use external audio tracks. // The Broken Sword games always use external audio tracks.
if (_fd->readUint32BE() != MKID_BE('NULL')) if (_fileStream->readUint32BE() != MKID_BE('NULL'))
return false; return false;
_frameBuffer = _vm->_screen->getScreen(); _frameBuffer = _vm->_screen->getScreen();

View file

@ -35,7 +35,7 @@
namespace Graphics { namespace Graphics {
DXAPlayer::DXAPlayer() { DXAPlayer::DXAPlayer() {
_fd = 0; _fileStream = 0;
_frameBuffer1 = 0; _frameBuffer1 = 0;
_frameBuffer2 = 0; _frameBuffer2 = 0;
@ -66,25 +66,25 @@ DXAPlayer::~DXAPlayer() {
} }
int DXAPlayer::getWidth() { int DXAPlayer::getWidth() {
if (!_fd) if (!_fileStream)
return 0; return 0;
return _width; return _width;
} }
int DXAPlayer::getHeight() { int DXAPlayer::getHeight() {
if (!_fd) if (!_fileStream)
return 0; return 0;
return _height; return _height;
} }
int DXAPlayer::getCurFrame() { int DXAPlayer::getCurFrame() {
if (!_fd) if (!_fileStream)
return -1; return -1;
return _frameNum; return _frameNum;
} }
int DXAPlayer::getFrameCount() { int DXAPlayer::getFrameCount() {
if (!_fd) if (!_fileStream)
return 0; return 0;
return _framesCount; return _framesCount;
} }
@ -99,14 +99,14 @@ bool DXAPlayer::loadFile(const char *filename) {
return 0; return 0;
} }
_fd = file; _fileStream = file;
tag = _fd->readUint32BE(); tag = _fileStream->readUint32BE();
assert(tag == MKID_BE('DEXA')); assert(tag == MKID_BE('DEXA'));
uint8 flags = _fd->readByte(); uint8 flags = _fileStream->readByte();
_framesCount = _fd->readUint16BE(); _framesCount = _fileStream->readUint16BE();
frameRate = _fd->readUint32BE(); frameRate = _fileStream->readUint32BE();
if (frameRate > 0) if (frameRate > 0)
_framesPerSec = 1000 / frameRate; _framesPerSec = 1000 / frameRate;
@ -120,8 +120,8 @@ bool DXAPlayer::loadFile(const char *filename) {
else else
_frameTicks = frameRate; _frameTicks = frameRate;
_width = _fd->readUint16BE(); _width = _fileStream->readUint16BE();
_height = _fd->readUint16BE(); _height = _fileStream->readUint16BE();
if (flags & 0x80) { if (flags & 0x80) {
_scaleMode = S_INTERLACED; _scaleMode = S_INTERLACED;
@ -156,20 +156,20 @@ bool DXAPlayer::loadFile(const char *filename) {
uint32 size; uint32 size;
do { do {
tag = _fd->readUint32BE(); tag = _fileStream->readUint32BE();
if (tag != 0) { if (tag != 0) {
size = _fd->readUint32BE(); size = _fileStream->readUint32BE();
} }
switch (tag) { switch (tag) {
case 0: // No more tags case 0: // No more tags
break; break;
case MKID_BE('MAXD'): case MKID_BE('MAXD'):
assert(size == 4); assert(size == 4);
_decompBufferSize = _fd->readUint32BE(); _decompBufferSize = _fileStream->readUint32BE();
break; break;
default: // Unknown tag - skip it. default: // Unknown tag - skip it.
while (size > 0) { while (size > 0) {
byte dummy = _fd->readByte(); byte dummy = _fileStream->readByte();
size--; size--;
} }
break; break;
@ -184,10 +184,10 @@ bool DXAPlayer::loadFile(const char *filename) {
} }
void DXAPlayer::closeFile() { void DXAPlayer::closeFile() {
if (!_fd) if (!_fileStream)
return; return;
delete _fd; delete _fileStream;
free(_frameBuffer1); free(_frameBuffer1);
free(_frameBuffer2); free(_frameBuffer2);
@ -195,7 +195,7 @@ void DXAPlayer::closeFile() {
free(_inBuffer); free(_inBuffer);
free(_decompBuffer); free(_decompBuffer);
_fd = 0; _fileStream = 0;
_inBuffer = 0; _inBuffer = 0;
_decompBuffer = 0; _decompBuffer = 0;
} }
@ -513,18 +513,18 @@ void DXAPlayer::decode13(int size) {
void DXAPlayer::decodeNextFrame() { void DXAPlayer::decodeNextFrame() {
uint32 tag; uint32 tag;
tag = _fd->readUint32BE(); tag = _fileStream->readUint32BE();
if (tag == MKID_BE('CMAP')) { if (tag == MKID_BE('CMAP')) {
byte rgb[768]; byte rgb[768];
_fd->read(rgb, ARRAYSIZE(rgb)); _fileStream->read(rgb, ARRAYSIZE(rgb));
setPalette(rgb); setPalette(rgb);
} }
tag = _fd->readUint32BE(); tag = _fileStream->readUint32BE();
if (tag == MKID_BE('FRAM')) { if (tag == MKID_BE('FRAM')) {
byte type = _fd->readByte(); byte type = _fileStream->readByte();
uint32 size = _fd->readUint32BE(); uint32 size = _fileStream->readUint32BE();
if ((_inBuffer == NULL) || (_inBufferSize < size)) { if ((_inBuffer == NULL) || (_inBufferSize < size)) {
free(_inBuffer); free(_inBuffer);
_inBuffer = (byte *)malloc(size); _inBuffer = (byte *)malloc(size);
@ -533,7 +533,7 @@ void DXAPlayer::decodeNextFrame() {
_inBufferSize = size; _inBufferSize = size;
} }
_fd->read(_inBuffer, size); _fileStream->read(_inBuffer, size);
switch (type) { switch (type) {
case 2: case 2:

View file

@ -61,7 +61,7 @@ public:
DXAPlayer(); DXAPlayer();
virtual ~DXAPlayer(); virtual ~DXAPlayer();
Common::SeekableReadStream *_fd; Common::SeekableReadStream *_fileStream;
/** /**
* Returns the width of the video * Returns the width of the video

View file

@ -17,6 +17,7 @@ MODULE_OBJS := \
primitives.o \ primitives.o \
scaler.o \ scaler.o \
scaler/thumbnail_intern.o \ scaler/thumbnail_intern.o \
smk_player.o \
surface.o \ surface.o \
thumbnail.o \ thumbnail.o \
VectorRenderer.o \ VectorRenderer.o \

View file

@ -154,7 +154,7 @@ int SmallHuffmanTree::decodeTree(int length) {
int r2 = decodeTree(length + 1); int r2 = decodeTree(length + 1);
return r1+r2+1; return r1+r2+1;
}; }
uint16 SmallHuffmanTree::getCode(BitStream &bs) { uint16 SmallHuffmanTree::getCode(BitStream &bs) {
uint16 *p = &_tree[0]; uint16 *p = &_tree[0];
@ -235,7 +235,7 @@ BigHuffmanTree::BigHuffmanTree(BitStream &bs)
delete _loBytes; delete _loBytes;
delete _hiBytes; delete _hiBytes;
}; }
void BigHuffmanTree::reset() { void BigHuffmanTree::reset() {
_tree[_last[0]] = _tree[_last[1]] = _tree[_last[2]] = 0; _tree[_last[0]] = _tree[_last[1]] = _tree[_last[2]] = 0;
@ -312,7 +312,7 @@ uint32 BigHuffmanTree::getCode(BitStream &bs) {
} }
SMKPlayer::SMKPlayer() SMKPlayer::SMKPlayer()
: _currentSMKFrame(0) { : _currentSMKFrame(0),_fileStream(0) {
} }
SMKPlayer::~SMKPlayer() { SMKPlayer::~SMKPlayer() {
@ -322,49 +322,53 @@ SMKPlayer::~SMKPlayer() {
bool SMKPlayer::loadFile(const char *fileName) { bool SMKPlayer::loadFile(const char *fileName) {
closeFile(); closeFile();
if (!_fileStream.open(fileName)) { Common::File *file = new Common::File();
if (!file->open(fileName)) {
delete file;
return false; return false;
} }
_fileStream = file;
// Seek to the first frame // Seek to the first frame
_currentSMKFrame = 0; _currentSMKFrame = 0;
_header.signature = _fileStream.readUint32BE(); _header.signature = _fileStream->readUint32BE();
assert(_header.signature == MKID_BE('SMK2') || _header.signature == MKID_BE('SMK4')); assert(_header.signature == MKID_BE('SMK2') || _header.signature == MKID_BE('SMK4'));
_header.width = _fileStream.readUint32LE(); _header.width = _fileStream->readUint32LE();
_header.height = _fileStream.readUint32LE(); _header.height = _fileStream->readUint32LE();
_header.frames = _fileStream.readUint32LE(); _header.frames = _fileStream->readUint32LE();
_framesCount = _header.frames; _framesCount = _header.frames;
_header.frameRate = (int32)_fileStream.readUint32LE(); _header.frameRate = (int32)_fileStream->readUint32LE();
_header.flags = _fileStream.readUint32LE(); _header.flags = _fileStream->readUint32LE();
unsigned int i; unsigned int i;
for (i = 0; i < 7; ++i) for (i = 0; i < 7; ++i)
_header.audioSize[i] = _fileStream.readUint32LE(); _header.audioSize[i] = _fileStream->readUint32LE();
_header.treesSize = _fileStream.readUint32LE(); _header.treesSize = _fileStream->readUint32LE();
_header.mMapSize = _fileStream.readUint32LE(); _header.mMapSize = _fileStream->readUint32LE();
_header.mClrSize = _fileStream.readUint32LE(); _header.mClrSize = _fileStream->readUint32LE();
_header.fullSize = _fileStream.readUint32LE(); _header.fullSize = _fileStream->readUint32LE();
_header.typeSize = _fileStream.readUint32LE(); _header.typeSize = _fileStream->readUint32LE();
for (i = 0; i < 7; ++i) 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)); _frameSizes = (uint32 *)malloc(_header.frames * sizeof(uint32));
for (i = 0; i < _header.frames; ++i) for (i = 0; i < _header.frames; ++i)
_frameSizes[i] = _fileStream.readUint32LE(); _frameSizes[i] = _fileStream->readUint32LE();
_frameTypes = (uint32 *)malloc(_header.frames * sizeof(uint32)); _frameTypes = (uint32 *)malloc(_header.frames * sizeof(uint32));
for (i = 0; i < _header.frames; ++i) for (i = 0; i < _header.frames; ++i)
_frameTypes[i] = _fileStream.readByte(); _frameTypes[i] = _fileStream->readByte();
Common::Array<byte> huffmanTrees; Common::Array<byte> huffmanTrees;
huffmanTrees.resize(_header.treesSize + 2); huffmanTrees.resize(_header.treesSize + 2);
_fileStream.read(&huffmanTrees[0], _header.treesSize); _fileStream->read(&huffmanTrees[0], _header.treesSize);
BitStream bs(&huffmanTrees[0], _header.treesSize + 2); BitStream bs(&huffmanTrees[0], _header.treesSize + 2);
@ -380,18 +384,20 @@ bool SMKPlayer::loadFile(const char *fileName) {
} }
void SMKPlayer::closeFile() { void SMKPlayer::closeFile() {
if (_fileStream.isOpen()) { if (!_fileStream)
delete _MMapTree; return;
delete _MClrTree;
delete _FullTree;
delete _TypeTree;
free(_frameSizes); delete _MMapTree;
free(_frameTypes); delete _MClrTree;
free(_image); delete _FullTree;
free(_palette); delete _TypeTree;
}
_fileStream.close(); free(_frameSizes);
free(_frameTypes);
free(_image);
free(_palette);
_fileStream = 0;
} }
void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { 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() { bool SMKPlayer::decodeNextFrame() {
uint i; uint i;
uint32 startPos = _fileStream.pos(); uint32 startPos = _fileStream->pos();
_paletteDidChange = false; _paletteDidChange = false;
if (_frameTypes[_currentSMKFrame] & 1) { if (_frameTypes[_currentSMKFrame] & 1) {
@ -426,20 +432,20 @@ bool SMKPlayer::decodeNextFrame() {
if (!(_frameTypes[_currentSMKFrame] & (2 << i))) if (!(_frameTypes[_currentSMKFrame] & (2 << i)))
continue; continue;
uint32 len = _fileStream.readUint32LE(); uint32 len = _fileStream->readUint32LE();
//uint32 unpackedLen = _fileStream.readUint32LE(); //uint32 unpackedLen = _fileStream->readUint32LE();
_fileStream.skip(len - 4); _fileStream->skip(len - 4);
} }
uint32 frameSize = _frameSizes[_currentSMKFrame] & ~3; uint32 frameSize = _frameSizes[_currentSMKFrame] & ~3;
if (_fileStream.pos() - startPos > frameSize) if (_fileStream->pos() - startPos > frameSize)
exit(1); exit(1);
uint32 frameDataSize = frameSize - (_fileStream.pos() - startPos); uint32 frameDataSize = frameSize - (_fileStream->pos() - startPos);
_frameData = (byte *)malloc(frameDataSize + 2); _frameData = (byte *)malloc(frameDataSize + 2);
_fileStream.read(_frameData, frameDataSize); _fileStream->read(_frameData, frameDataSize);
BitStream bs(_frameData, frameDataSize + 2); BitStream bs(_frameData, frameDataSize + 2);
@ -590,7 +596,7 @@ bool SMKPlayer::decodeNextFrame() {
} }
} }
_fileStream.seek(startPos + frameSize); _fileStream->seek(startPos + frameSize);
free(_frameData); free(_frameData);
@ -598,11 +604,11 @@ bool SMKPlayer::decodeNextFrame() {
} }
void SMKPlayer::unpackPalette() { void SMKPlayer::unpackPalette() {
uint startPos = _fileStream.pos(); uint startPos = _fileStream->pos();
uint32 len = 4 * _fileStream.readByte(); uint32 len = 4 * _fileStream->readByte();
byte *chunk = (byte *)malloc(len); byte *chunk = (byte *)malloc(len);
_fileStream.read(&chunk[0], len); _fileStream->read(&chunk[0], len);
byte *p = &chunk[0]; byte *p = &chunk[0];
byte oldPalette[3*256]; byte oldPalette[3*256];
@ -642,7 +648,7 @@ void SMKPlayer::unpackPalette() {
} }
} }
_fileStream.seek(startPos + len); _fileStream->seek(startPos + len);
free(chunk); free(chunk);
} }

View file

@ -50,7 +50,9 @@ class BigHuffmanTree;
class SMKPlayer { class SMKPlayer {
public: public:
SMKPlayer(); SMKPlayer();
~SMKPlayer(); virtual ~SMKPlayer();
Common::SeekableReadStream *_fileStream;
/** /**
* Returns the width of the video * Returns the width of the video
@ -68,7 +70,7 @@ public:
* Returns the current frame number of the video * Returns the current frame number of the video
* @return 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 * Returns the amount of frames in the video
@ -124,7 +126,6 @@ protected:
private: private:
void unpackPalette(); void unpackPalette();
Common::File _fileStream;
uint32 _currentSMKFrame; uint32 _currentSMKFrame;
struct { struct {