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

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Sun Jan 16 17:26:52 CET 2011


Revision: 55257
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55257&view=rev
Author:   drmccoy
Date:     2011-01-16 16:26:52 +0000 (Sun, 16 Jan 2011)

Log Message:
-----------
VIDEO: Simplying the video buffers

Modified Paths:
--------------
    scummvm/trunk/graphics/video/coktel_decoder.cpp
    scummvm/trunk/graphics/video/coktel_decoder.h

Modified: scummvm/trunk/graphics/video/coktel_decoder.cpp
===================================================================
--- scummvm/trunk/graphics/video/coktel_decoder.cpp	2011-01-16 11:02:49 UTC (rev 55256)
+++ scummvm/trunk/graphics/video/coktel_decoder.cpp	2011-01-16 16:26:52 UTC (rev 55257)
@@ -791,11 +791,13 @@
 
 IMDDecoder::IMDDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : CoktelDecoder(mixer, soundType),
 	_stream(0), _version(0), _stdX(-1), _stdY(-1), _stdWidth(-1), _stdHeight(-1),
-	_flags(0), _firstFramePos(0), _framePos(0), _frameCoords(0),
-	_frameData(0), _frameDataSize(0), _frameDataLen(0),
-	_videoBuffer(0), _videoBufferSize(0),
+	_flags(0), _firstFramePos(0), _framePos(0), _frameCoords(0), _videoBufferSize(0),
 	_soundFlags(0), _soundFreq(0), _soundSliceSize(0), _soundSlicesCount(0) {
 
+	_videoBuffer   [0] = 0;
+	_videoBuffer   [1] = 0;
+	_videoBufferLen[0] = 0;
+	_videoBufferLen[1] = 0;
 }
 
 IMDDecoder::~IMDDecoder() {
@@ -1004,27 +1006,36 @@
 }
 
 bool IMDDecoder::assessVideoProperties() {
+	uint32 suggestedVideoBufferSize = 0;
+
 	// Sizes of the frame data and extra video buffer
 	if (_features & kFeaturesDataSize) {
-		_frameDataSize = _stream->readUint16LE();
-		if (_frameDataSize == 0) {
-			_frameDataSize   = _stream->readUint32LE();
-			_videoBufferSize = _stream->readUint32LE();
+		uint32 size1, size2;
+
+		size1 = _stream->readUint16LE();
+		if (size1 == 0) {
+			size1 = _stream->readUint32LE();
+			size2 = _stream->readUint32LE();
 		} else
-			_videoBufferSize = _stream->readUint16LE();
-	} else {
-		_frameDataSize = _width * _height + 500;
-		if (!(_flags & 0x100) || (_flags & 0x1000))
-			_videoBufferSize = _frameDataSize;
+			size2 = _stream->readUint16LE();
+
+		suggestedVideoBufferSize = MAX(size1, size2);
 	}
 
-	// Allocating working memory
-	_frameData = new byte[_frameDataSize + 500];
-	memset(_frameData, 0, _frameDataSize + 500);
+	_videoBufferSize = _width * _height + 1000;
 
-	_videoBuffer = new byte[_videoBufferSize + 500];
-	memset(_videoBuffer, 0, _videoBufferSize + 500);
+	if (suggestedVideoBufferSize > _videoBufferSize) {
+		warning("Suggested video buffer size greater than what should be needed (%d, %d, %dx%d",
+			suggestedVideoBufferSize, _videoBufferSize, _width, _height);
 
+		_videoBufferSize = suggestedVideoBufferSize;
+	}
+
+	for (int i = 0; i < 2; i++) {
+		_videoBuffer[i] = new byte[_videoBufferSize];
+		memset(_videoBuffer[i], 0, _videoBufferSize);
+	}
+
 	return true;
 }
 
@@ -1091,10 +1102,9 @@
 	delete[] _framePos;
 	delete[] _frameCoords;
 
-	delete[] _frameData;
+	delete[] _videoBuffer[0];
+	delete[] _videoBuffer[1];
 
-	delete[] _videoBuffer;
-
 	_stream = 0;
 
 	_version = 0;
@@ -1110,13 +1120,12 @@
 	_framePos      = 0;
 	_frameCoords   = 0;
 
-	_frameData     = 0;
-	_frameDataSize = 0;
-	_frameDataLen  = 0;
+	_videoBufferSize   = 0;
+	_videoBuffer   [0] = 0;
+	_videoBuffer   [1] = 0;
+	_videoBufferLen[0] = 0;
+	_videoBufferLen[1] = 0;
 
-	_videoBuffer     = 0;
-	_videoBufferSize = 0;
-
 	_soundFlags       = 0;
 	_soundFreq        = 0;
 	_soundSliceSize   = 0;
@@ -1222,8 +1231,8 @@
 
 		} else if (cmd == kCommandVideoData) {
 
-			_frameDataLen = _stream->readUint32LE() + 2;
-			_stream->read(_frameData, _frameDataLen);
+			_videoBufferLen[0] = _stream->readUint32LE() + 2;
+			_stream->read(_videoBuffer[0], _videoBufferLen[0]);
 
 			Common::Rect rect = calcFrameCoords(_curFrame);
 
@@ -1232,8 +1241,8 @@
 
 		} else if (cmd != 0) {
 
-			_frameDataLen = cmd + 2;
-			_stream->read(_frameData, _frameDataLen);
+			_videoBufferLen[0] = cmd + 2;
+			_stream->read(_videoBuffer[0], _videoBufferLen[0]);
 
 			Common::Rect rect = calcFrameCoords(_curFrame);
 
@@ -1307,7 +1316,7 @@
 		// Result is empty => nothing to do
 		return false;
 
-	byte *dataPtr = _frameData;
+	byte *dataPtr = _videoBuffer[0];
 
 	uint8 type = *dataPtr++;
 
@@ -1338,9 +1347,9 @@
 			return true;
 		}
 
-		deLZ77(_videoBuffer, dataPtr);
+		deLZ77(_videoBuffer[1], dataPtr);
 
-		dataPtr = _videoBuffer;
+		dataPtr = _videoBuffer[1];
 	}
 
 	// Evaluate the block type
@@ -1488,11 +1497,13 @@
 	_soundFlags(0), _soundFreq(0), _soundSliceSize(0), _soundSlicesCount(0),
 	_soundBytesPerSample(0), _soundStereo(0), _soundHeaderSize(0), _soundDataSize(0),
 	_audioFormat(kAudioFormat8bitRaw), _hasVideo(false), _videoCodec(0),
-	_blitMode(0), _bytesPerPixel(0), _firstFramePos(0),
-	_frameData(0), _frameDataSize(0), _frameDataLen(0),
-	_videoBuffer(0), _videoBufferSize(0), _externalCodec(false), _codec(0),
-	_subtitle(-1) {
+	_blitMode(0), _bytesPerPixel(0), _firstFramePos(0), _videoBufferSize(0),
+	_externalCodec(false), _codec(0), _subtitle(-1) {
 
+	_videoBuffer   [0] = 0;
+	_videoBuffer   [1] = 0;
+	_videoBufferLen[0] = 0;
+	_videoBufferLen[1] = 0;
 }
 
 VMDDecoder::~VMDDecoder() {
@@ -1616,9 +1627,11 @@
 		_paletteDirty = true;
 	}
 
-	_frameDataSize   = _stream->readUint32LE();
-	_videoBufferSize = _stream->readUint32LE();
+	uint32 videoBufferSize1 = _stream->readUint32LE();
+	uint32 videoBufferSize2 = _stream->readUint32LE();
 
+	_videoBufferSize = MAX(videoBufferSize1, videoBufferSize2);
+
 	if (_hasVideo) {
 		if (!assessVideoProperties()) {
 			close();
@@ -1666,8 +1679,8 @@
 
 bool VMDDecoder::assessVideoProperties() {
 	if ((_version & 2) && !(_version & 8)) {
-		_externalCodec = true;
-		_frameDataSize = _videoBufferSize = 0;
+		_externalCodec   = true;
+		_videoBufferSize = 0;
 	} else
 		_externalCodec = false;
 
@@ -1701,17 +1714,25 @@
 		return false;
 	}
 
+	if (_blitMode != 0)
+		_width /= _bytesPerPixel;
+
 	if (_hasVideo) {
-		if ((_frameDataSize == 0) || (_frameDataSize > 1048576))
-			_frameDataSize = _width * _height + 1000;
-		if ((_videoBufferSize == 0) || (_videoBufferSize > 1048576))
-			_videoBufferSize = _frameDataSize;
+		uint32 suggestedVideoBufferSize = _videoBufferSize;
 
-		_frameData = new byte[_frameDataSize];
-		memset(_frameData, 0, _frameDataSize);
+		_videoBufferSize = _width * _height * _bytesPerPixel + 1000;
 
-		_videoBuffer = new byte[_videoBufferSize];
-		memset(_videoBuffer, 0, _videoBufferSize);
+		if ((suggestedVideoBufferSize > _videoBufferSize) && (suggestedVideoBufferSize < 2097152)) {
+			warning("Suggested video buffer size greater than what should be needed (%d, %d, %dx%d",
+				suggestedVideoBufferSize, _videoBufferSize, _width, _height);
+
+			_videoBufferSize = suggestedVideoBufferSize;
+		}
+
+		for (int i = 0; i < 2; i++) {
+			_videoBuffer[i] = new byte[_videoBufferSize];
+			memset(_videoBuffer[i], 0, _videoBufferSize);
+		}
 	}
 
 	return true;
@@ -1879,8 +1900,8 @@
 
 	delete[] _frames;
 
-	delete[] _frameData;
-	delete[] _videoBuffer;
+	delete[] _videoBuffer[0];
+	delete[] _videoBuffer[1];
 
 	delete _codec;
 
@@ -1913,13 +1934,12 @@
 
 	_firstFramePos = 0;
 
-	_frameData     = 0;
-	_frameDataSize = 0;
-	_frameDataLen  = 0;
+	_videoBufferSize   = 0;
+	_videoBuffer   [0] = 0;
+	_videoBuffer   [1] = 0;
+	_videoBufferLen[0] = 0;
+	_videoBufferLen[1] = 0;
 
-	_videoBuffer     = 0;
-	_videoBufferSize = 0;
-
 	_externalCodec = false;
 	_codec         = 0;
 }
@@ -2030,8 +2050,8 @@
 				size -= (768 + 2);
 			}
 
-			_stream->read(_frameData, size);
-			_frameDataLen = size;
+			_stream->read(_videoBuffer[0], size);
+			_videoBufferLen[0] = size;
 
 			Common::Rect rect(part.left, part.top, part.right + 1, part.bottom + 1);
 			if (renderFrame(rect))
@@ -2095,7 +2115,7 @@
 		if (!_codec)
 			return false;
 
-		Common::MemoryReadStream frameStream(_frameData, _frameDataLen);
+		Common::MemoryReadStream frameStream(_videoBuffer[0], _videoBufferLen[0]);
 		const Surface *codecSurf = _codec->decodeImage(&frameStream);
 		if (!codecSurf)
 			return false;
@@ -2113,7 +2133,7 @@
 		return false;
 	}
 
-	byte *dataPtr = _frameData;
+	byte *dataPtr = _videoBuffer[0];
 
 	uint8 type = *dataPtr++;
 
@@ -2128,9 +2148,9 @@
 			return true;
 		}
 
-		deLZ77(_videoBuffer, dataPtr);
+		deLZ77(_videoBuffer[1], dataPtr);
 
-		dataPtr = _videoBuffer;
+		dataPtr = _videoBuffer[1];
 	}
 
 	// Evaluate the block type

Modified: scummvm/trunk/graphics/video/coktel_decoder.h
===================================================================
--- scummvm/trunk/graphics/video/coktel_decoder.h	2011-01-16 11:02:49 UTC (rev 55256)
+++ scummvm/trunk/graphics/video/coktel_decoder.h	2011-01-16 16:26:52 UTC (rev 55257)
@@ -304,15 +304,10 @@
 	uint32 *_framePos;      ///< Positions of all frames.
 	Coord  *_frameCoords;   ///< Coordinates of all frames.
 
-	// Buffer for raw frame data
-	byte  *_frameData;
-	uint32 _frameDataSize;
-	uint32 _frameDataLen;
+	uint32 _videoBufferSize;   ///< Size of the video buffers.
+	byte  *_videoBuffer[2];    ///< Video buffers.
+	uint32 _videoBufferLen[2]; ///< Size of the video buffers filled.
 
-	// Buffer for processed frame data
-	byte  *_videoBuffer;
-	uint32 _videoBufferSize;
-
 	// Sound properties
 	uint16 _soundFlags;
 	 int16 _soundFreq;
@@ -452,15 +447,10 @@
 
 	uint32  _firstFramePos; ///< Position of the first frame's data within the stream.
 
-	// Buffer for raw frame data
-	byte  *_frameData;
-	uint32 _frameDataSize;
-	uint32 _frameDataLen;
+	uint32 _videoBufferSize;   ///< Size of the video buffers.
+	byte  *_videoBuffer[2];    ///< Video buffers.
+	uint32 _videoBufferLen[2]; ///< Size of the video buffers filled.
 
-	// Buffer for processed frame data
-	byte  *_videoBuffer;
-	uint32 _videoBufferSize;
-
 	bool _externalCodec;
 	Codec *_codec;
 


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