diff options
| author | Filippos Karapetis | 2009-01-06 17:44:41 +0000 | 
|---|---|---|
| committer | Filippos Karapetis | 2009-01-06 17:44:41 +0000 | 
| commit | a930f402727940bb5778980d031b6cc66263f3a0 (patch) | |
| tree | 170f30e81c7a6ed69627c7ecd906f9d57a19ff10 | |
| parent | fa1d881ad44a515e57b87ba27b325d1eeb4a750b (diff) | |
| download | scummvm-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
| -rw-r--r-- | graphics/video/dxa_player.cpp | 2 | ||||
| -rw-r--r-- | graphics/video/dxa_player.h | 41 | ||||
| -rw-r--r-- | graphics/video/flic_player.cpp | 92 | ||||
| -rw-r--r-- | graphics/video/flic_player.h | 33 | ||||
| -rw-r--r-- | graphics/video/smk_player.cpp | 17 | ||||
| -rw-r--r-- | graphics/video/smk_player.h | 12 | 
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 | 
