From a930f402727940bb5778980d031b6cc66263f3a0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 6 Jan 2009 17:44:41 +0000 Subject: An attempt to unify the different video players (FLIC player is not finished yet) - step 1 svn-id: r35757 --- graphics/video/dxa_player.cpp | 2 +- graphics/video/dxa_player.h | 41 ++++++++++--------- graphics/video/flic_player.cpp | 92 ++++++++++++++++++++++++++++-------------- graphics/video/flic_player.h | 33 ++++++++------- graphics/video/smk_player.cpp | 17 ++++---- graphics/video/smk_player.h | 12 ++++-- 6 files changed, 118 insertions(+), 79 deletions(-) (limited to 'graphics') diff --git a/graphics/video/dxa_player.cpp b/graphics/video/dxa_player.cpp index 39c44a4770..c1d3f6f7cf 100644 --- a/graphics/video/dxa_player.cpp +++ b/graphics/video/dxa_player.cpp @@ -195,6 +195,7 @@ void DXAPlayer::closeFile() { return; delete _fileStream; + _fileStream = 0; free(_frameBuffer1); free(_frameBuffer2); @@ -202,7 +203,6 @@ void DXAPlayer::closeFile() { free(_inBuffer); free(_decompBuffer); - _fileStream = 0; _inBuffer = 0; _decompBuffer = 0; } diff --git a/graphics/video/dxa_player.h b/graphics/video/dxa_player.h index 44db6fb99e..3239913131 100644 --- a/graphics/video/dxa_player.h +++ b/graphics/video/dxa_player.h @@ -38,24 +38,6 @@ enum ScaleMode { }; class DXAPlayer { -protected: - byte *_frameBuffer1; - byte *_frameBuffer2; - byte *_scaledBuffer; - byte *_drawBuffer; - byte *_inBuffer; - uint32 _inBufferSize; - byte *_decompBuffer; - uint32 _decompBufferSize; - uint16 _width; - uint16 _height, _curHeight; - uint16 _framesCount; - uint32 _framesPerSec; - uint16 _frameNum; - uint32 _frameSize; - uint32 _frameTicks; - ScaleMode _scaleMode; - public: DXAPlayer(); virtual ~DXAPlayer(); @@ -107,6 +89,11 @@ public: */ void closeFile(); + /** + * Returns if a video file is loaded or not + */ + bool videoIsLoaded() { return (_fileStream != NULL); } + protected: /** * Set RGB palette, based on current frame @@ -134,6 +121,24 @@ protected: void decode13(int size); Common::SeekableReadStream *_fileStream; + +private: + byte *_frameBuffer1; + byte *_frameBuffer2; + byte *_scaledBuffer; + byte *_drawBuffer; + byte *_inBuffer; + uint32 _inBufferSize; + byte *_decompBuffer; + uint32 _decompBufferSize; + uint16 _width; + uint16 _height, _curHeight; + uint16 _framesCount; + uint32 _framesPerSec; + uint16 _frameNum; + uint32 _frameSize; + uint32 _frameTicks; + ScaleMode _scaleMode; }; } // End of namespace Graphics diff --git a/graphics/video/flic_player.cpp b/graphics/video/flic_player.cpp index 42d063f9ff..a6062aeb16 100644 --- a/graphics/video/flic_player.cpp +++ b/graphics/video/flic_player.cpp @@ -23,12 +23,13 @@ * */ +#include "common/archive.h" #include "graphics/video/flic_player.h" namespace Graphics { FlicPlayer::FlicPlayer() - : _paletteDirty(false), _offscreen(0), _currFrame(0) { + : _paletteDirty(false), _offscreen(0), _currFrame(0), _fileStream(0) { memset(&_flicInfo, 0, sizeof(_flicInfo)); } @@ -36,43 +37,74 @@ FlicPlayer::~FlicPlayer() { closeFile(); } +int FlicPlayer::getWidth() { + if (!_fileStream) + return 0; + return _flicInfo.width; +} + +int FlicPlayer::getHeight() { + if (!_fileStream) + return 0; + return _flicInfo.height; +} + +int32 FlicPlayer::getCurFrame() { + if (!_fileStream) + return -1; + return _currFrame; +} + +int32 FlicPlayer::getFrameCount() { + if (!_fileStream) + return 0; + return _flicInfo.numFrames; +} + bool FlicPlayer::loadFile(const char *fileName) { closeFile(); - if (!_fileStream.open(fileName)) { + _fileStream = SearchMan.openFile(fileName); + if (!_fileStream) return false; - } - - _flicInfo.size = _fileStream.readUint32LE(); - _flicInfo.type = _fileStream.readUint16LE(); - _flicInfo.numFrames = _fileStream.readUint16LE(); - _flicInfo.width = _fileStream.readUint16LE(); - _flicInfo.height = _fileStream.readUint16LE(); - _fileStream.skip(4); - _flicInfo.speed = _fileStream.readUint32LE(); - _fileStream.seek(80); - _flicInfo.offsetFrame1 = _fileStream.readUint32LE(); - _flicInfo.offsetFrame2 = _fileStream.readUint32LE(); + _flicInfo.size = _fileStream->readUint32LE(); + _flicInfo.type = _fileStream->readUint16LE(); // Check FLC magic number if (_flicInfo.type != 0xAF12) { - error("FlicPlayer::FlicPlayer(): attempted to load non-FLC data (type = 0x%04X)", _flicInfo.type); + warning("FlicPlayer::FlicPlayer(): attempted to load non-FLC data (type = 0x%04X)", _flicInfo.type); + delete _fileStream; + return false; } + _flicInfo.numFrames = _fileStream->readUint16LE(); + _flicInfo.width = _fileStream->readUint16LE(); + _flicInfo.height = _fileStream->readUint16LE(); + _fileStream->skip(4); + _flicInfo.speed = _fileStream->readUint32LE(); + + _fileStream->seek(80); + _flicInfo.offsetFrame1 = _fileStream->readUint32LE(); + _flicInfo.offsetFrame2 = _fileStream->readUint32LE(); + _offscreen = new uint8[_flicInfo.width * _flicInfo.height]; memset(_palette, 0, sizeof(_palette)); _paletteDirty = false; // Seek to the first frame _currFrame = 0; - _fileStream.seek(_flicInfo.offsetFrame1); + _fileStream->seek(_flicInfo.offsetFrame1); return true; } void FlicPlayer::closeFile() { - memset(&_flicInfo, 0, sizeof(_flicInfo)); - _fileStream.close(); + if (!_fileStream) + return; + + delete _fileStream; + _fileStream = 0; + delete[] _offscreen; _offscreen = 0; } @@ -85,8 +117,8 @@ void FlicPlayer::redraw() { ChunkHeader FlicPlayer::readChunkHeader() { ChunkHeader head; - head.size = _fileStream.readUint32LE(); - head.type = _fileStream.readUint16LE(); + head.size = _fileStream->readUint32LE(); + head.type = _fileStream->readUint16LE(); return head; } @@ -95,11 +127,11 @@ FrameTypeChunkHeader FlicPlayer::readFrameTypeChunkHeader(ChunkHeader chunkHead) FrameTypeChunkHeader head; head.header = chunkHead; - head.numChunks = _fileStream.readUint16LE(); - head.delay = _fileStream.readUint16LE(); - head.reserved = _fileStream.readUint16LE(); - head.widthOverride = _fileStream.readUint16LE(); - head.heightOverride = _fileStream.readUint16LE(); + head.numChunks = _fileStream->readUint16LE(); + head.delay = _fileStream->readUint16LE(); + head.reserved = _fileStream->readUint16LE(); + head.widthOverride = _fileStream->readUint16LE(); + head.heightOverride = _fileStream->readUint16LE(); return head; } @@ -184,7 +216,7 @@ void FlicPlayer::decodeDeltaFLC(uint8 *data) { } } -#define COLOR_256 4 +#define FLI_SETPAL 4 #define FLI_SS2 7 #define FLI_BRUN 15 #define PSTAMP 18 @@ -210,9 +242,9 @@ void FlicPlayer::decodeNextFrame() { for (int i = 0; i < frameHeader.numChunks; ++i) { cHeader = readChunkHeader(); uint8 *data = new uint8[cHeader.size - 6]; - _fileStream.read(data, cHeader.size - 6); + _fileStream->read(data, cHeader.size - 6); switch (cHeader.type) { - case COLOR_256: + case FLI_SETPAL: setPalette(data); _paletteDirty = true; break; @@ -237,13 +269,13 @@ void FlicPlayer::decodeNextFrame() { // If we just processed the ring frame, set the next frame if (_currFrame == _flicInfo.numFrames + 1) { _currFrame = 1; - _fileStream.seek(_flicInfo.offsetFrame2); + _fileStream->seek(_flicInfo.offsetFrame2); } } void FlicPlayer::reset() { _currFrame = 0; - _fileStream.seek(_flicInfo.offsetFrame1); + _fileStream->seek(_flicInfo.offsetFrame1); } void FlicPlayer::setPalette(uint8 *mem) { diff --git a/graphics/video/flic_player.h b/graphics/video/flic_player.h index 73d086cbec..7f0a029df8 100644 --- a/graphics/video/flic_player.h +++ b/graphics/video/flic_player.h @@ -33,17 +33,6 @@ namespace Graphics { -struct FlicHeader { - uint32 size; - uint16 type; - uint16 numFrames; - uint16 width; - uint16 height; - uint32 speed; - uint16 offsetFrame1; - uint16 offsetFrame2; -}; - struct ChunkHeader { uint32 size; uint16 type; @@ -67,25 +56,25 @@ public: * Returns the width of the video * @return the width of the video */ - int getWidth() const { return _flicInfo.width; } + int getWidth(); /** * Returns the height of the video * @return the height of the video */ - int getHeight() const { return _flicInfo.height; } + int getHeight(); /** * Returns the current frame number of the video * @return the current frame number of the video */ - int getCurFrame() const { return _currFrame; } + int32 getCurFrame(); /** * Returns the amount of frames in the video * @return the amount of frames in the video */ - int getFrameCount() const { return _flicInfo.numFrames; } + int32 getFrameCount(); /** * Load a FLIC encoded video file @@ -123,7 +112,17 @@ public: */ void copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch); -protected: +private: + struct FlicHeader { + uint32 size; + uint16 type; + uint16 numFrames; + uint16 width; + uint16 height; + uint32 speed; + uint16 offsetFrame1; + uint16 offsetFrame2; + }; ChunkHeader readChunkHeader(); FrameTypeChunkHeader readFrameTypeChunkHeader(ChunkHeader chunkHead); @@ -131,7 +130,7 @@ protected: void decodeDeltaFLC(uint8 *data); void setPalette(uint8 *mem); - Common::File _fileStream; + Common::SeekableReadStream *_fileStream; bool _paletteDirty; uint8 *_offscreen; uint8 _palette[256 * 4]; diff --git a/graphics/video/smk_player.cpp b/graphics/video/smk_player.cpp index 5ad7044c5f..548ed70134 100644 --- a/graphics/video/smk_player.cpp +++ b/graphics/video/smk_player.cpp @@ -502,8 +502,8 @@ bool SMKPlayer::loadFile(const char *fileName) { _FullTree = new BigHuffmanTree(bs); _TypeTree = new BigHuffmanTree(bs); - _image = (byte *)malloc(2 * _header.width * _header.height); - memset(_image, 0, 2 * _header.width * _header.height); + _videoFrameBuffer = (byte *)malloc(2 * _header.width * _header.height); + memset(_videoFrameBuffer, 0, 2 * _header.width * _header.height); _palette = (byte *)malloc(3 * 256); memset(_palette, 0, 3 * 256); @@ -521,6 +521,7 @@ void SMKPlayer::closeFile() { } delete _fileStream; + _fileStream = 0; delete _MMapTree; delete _MClrTree; @@ -529,17 +530,15 @@ void SMKPlayer::closeFile() { free(_frameSizes); free(_frameTypes); - free(_image); + free(_videoFrameBuffer); free(_palette); - - _fileStream = 0; } void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { uint h = (_header.flags ? 2 : 1) * _header.height; uint w = _header.width; - byte *src = _image; + byte *src = _videoFrameBuffer; dst += y * pitch + x; do { @@ -653,7 +652,7 @@ bool SMKPlayer::decodeNextFrame() { while (run-- && block < blocks) { clr = _MClrTree->getCode(bs); map = _MMapTree->getCode(bs); - out = _image + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; + out = _videoFrameBuffer + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; hi = clr >> 8; lo = clr & 0xff; for (i = 0; i < 4; i++) { @@ -686,7 +685,7 @@ bool SMKPlayer::decodeNextFrame() { } while (run-- && block < blocks) { - out = _image + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; + out = _videoFrameBuffer + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; switch (mode) { case 0: for (i = 0; i < 4; ++i) { @@ -752,7 +751,7 @@ bool SMKPlayer::decodeNextFrame() { uint32 col; mode = type >> 8; while (run-- && block < blocks) { - out = _image + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; + out = _videoFrameBuffer + (block / bw) * (stride * 4 * doubleY) + (block % bw) * 4; col = mode * 0x01010101; for (i = 0; i < 4 * doubleY; ++i) { out[0] = out[1] = out[2] = out[3] = col; diff --git a/graphics/video/smk_player.h b/graphics/video/smk_player.h index 62db02edd9..93f4457f2b 100644 --- a/graphics/video/smk_player.h +++ b/graphics/video/smk_player.h @@ -108,6 +108,11 @@ public: */ void closeFile(); + /** + * Returns if a video file is loaded or not + */ + bool videoIsLoaded() { return (_fileStream != NULL); } + protected: /** * Set RGB palette, based on current frame @@ -130,10 +135,6 @@ protected: */ bool decodeNextFrame(); - Common::SeekableReadStream *_fileStream; - - byte *_image; - private: void unpackPalette(); // Possible runs of blocks @@ -188,6 +189,9 @@ private: BigHuffmanTree *_MClrTree; BigHuffmanTree *_FullTree; BigHuffmanTree *_TypeTree; + + Common::SeekableReadStream *_fileStream; + byte *_videoFrameBuffer; }; } // End of namespace Graphics -- cgit v1.2.3