[Scummvm-cvs-logs] SF.net SVN: scummvm:[35757] scummvm/trunk/graphics/video

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Tue Jan 6 18:44:41 CET 2009


Revision: 35757
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35757&view=rev
Author:   thebluegr
Date:     2009-01-06 17:44:41 +0000 (Tue, 06 Jan 2009)

Log Message:
-----------
An attempt to unify the different video players (FLIC player is not finished yet) - step 1

Modified Paths:
--------------
    scummvm/trunk/graphics/video/dxa_player.cpp
    scummvm/trunk/graphics/video/dxa_player.h
    scummvm/trunk/graphics/video/flic_player.cpp
    scummvm/trunk/graphics/video/flic_player.h
    scummvm/trunk/graphics/video/smk_player.cpp
    scummvm/trunk/graphics/video/smk_player.h

Modified: scummvm/trunk/graphics/video/dxa_player.cpp
===================================================================
--- scummvm/trunk/graphics/video/dxa_player.cpp	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/dxa_player.cpp	2009-01-06 17:44:41 UTC (rev 35757)
@@ -195,6 +195,7 @@
 		return;
 
 	delete _fileStream;
+	_fileStream = 0;
 
 	free(_frameBuffer1);
 	free(_frameBuffer2);
@@ -202,7 +203,6 @@
 	free(_inBuffer);
 	free(_decompBuffer);
 
-	_fileStream = 0;
 	_inBuffer = 0;
 	_decompBuffer = 0;
 }

Modified: scummvm/trunk/graphics/video/dxa_player.h
===================================================================
--- scummvm/trunk/graphics/video/dxa_player.h	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/dxa_player.h	2009-01-06 17:44:41 UTC (rev 35757)
@@ -38,24 +38,6 @@
 };
 
 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 @@
 	 */
 	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 @@
 	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

Modified: scummvm/trunk/graphics/video/flic_player.cpp
===================================================================
--- scummvm/trunk/graphics/video/flic_player.cpp	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/flic_player.cpp	2009-01-06 17:44:41 UTC (rev 35757)
@@ -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 @@
 	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();
+	_flicInfo.size = _fileStream->readUint32LE();
+	_flicInfo.type = _fileStream->readUint16LE();
 
-	_fileStream.seek(80);
-	_flicInfo.offsetFrame1 = _fileStream.readUint32LE();
-	_flicInfo.offsetFrame2 = _fileStream.readUint32LE();
-
 	// 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 @@
 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 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 @@
 	}
 }
 
-#define COLOR_256  4
+#define FLI_SETPAL 4
 #define FLI_SS2    7
 #define FLI_BRUN   15
 #define PSTAMP     18
@@ -210,9 +242,9 @@
 		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 @@
 	// 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) {

Modified: scummvm/trunk/graphics/video/flic_player.h
===================================================================
--- scummvm/trunk/graphics/video/flic_player.h	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/flic_player.h	2009-01-06 17:44:41 UTC (rev 35757)
@@ -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 @@
 	 * 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 @@
 	 */
 	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 @@
 	void decodeDeltaFLC(uint8 *data);
 	void setPalette(uint8 *mem);
 
-	Common::File _fileStream;
+	Common::SeekableReadStream *_fileStream;
 	bool _paletteDirty;
 	uint8 *_offscreen;
 	uint8 _palette[256 * 4];

Modified: scummvm/trunk/graphics/video/smk_player.cpp
===================================================================
--- scummvm/trunk/graphics/video/smk_player.cpp	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/smk_player.cpp	2009-01-06 17:44:41 UTC (rev 35757)
@@ -502,8 +502,8 @@
 	_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 @@
 	}
 
 	delete _fileStream;
+	_fileStream = 0;
 
 	delete _MMapTree;
 	delete _MClrTree;
@@ -529,17 +530,15 @@
 
 	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 @@
 			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 @@
 			}
 
 			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 @@
 			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;

Modified: scummvm/trunk/graphics/video/smk_player.h
===================================================================
--- scummvm/trunk/graphics/video/smk_player.h	2009-01-06 16:21:23 UTC (rev 35756)
+++ scummvm/trunk/graphics/video/smk_player.h	2009-01-06 17:44:41 UTC (rev 35757)
@@ -108,6 +108,11 @@
 	 */
 	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 @@
 	 */
 	bool decodeNextFrame();
 
-	Common::SeekableReadStream *_fileStream;
-
-	byte *_image;
-
 private:
 	void unpackPalette();
 	// Possible runs of blocks
@@ -188,6 +189,9 @@
 	BigHuffmanTree *_MClrTree;
 	BigHuffmanTree *_FullTree;
 	BigHuffmanTree *_TypeTree;
+
+	Common::SeekableReadStream *_fileStream;
+	byte *_videoFrameBuffer;
 };
 
 } // End of namespace Graphics


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list