aboutsummaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
authorFilippos Karapetis2009-01-06 17:44:41 +0000
committerFilippos Karapetis2009-01-06 17:44:41 +0000
commita930f402727940bb5778980d031b6cc66263f3a0 (patch)
tree170f30e81c7a6ed69627c7ecd906f9d57a19ff10 /graphics
parentfa1d881ad44a515e57b87ba27b325d1eeb4a750b (diff)
downloadscummvm-rg350-a930f402727940bb5778980d031b6cc66263f3a0.tar.gz
scummvm-rg350-a930f402727940bb5778980d031b6cc66263f3a0.tar.bz2
scummvm-rg350-a930f402727940bb5778980d031b6cc66263f3a0.zip
An attempt to unify the different video players (FLIC player is not finished yet) - step 1
svn-id: r35757
Diffstat (limited to 'graphics')
-rw-r--r--graphics/video/dxa_player.cpp2
-rw-r--r--graphics/video/dxa_player.h41
-rw-r--r--graphics/video/flic_player.cpp92
-rw-r--r--graphics/video/flic_player.h33
-rw-r--r--graphics/video/smk_player.cpp17
-rw-r--r--graphics/video/smk_player.h12
6 files changed, 118 insertions, 79 deletions
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