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:
parent
41499091b0
commit
9c20a533bb
10 changed files with 104 additions and 115 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue