[Scummvm-cvs-logs] SF.net SVN: scummvm: [31641] scummvm/trunk/engines/made

john_doe at users.sourceforge.net john_doe at users.sourceforge.net
Mon Apr 21 13:05:45 CEST 2008


Revision: 31641
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31641&view=rev
Author:   john_doe
Date:     2008-04-21 04:05:44 -0700 (Mon, 21 Apr 2008)

Log Message:
-----------
Fixed palette handling in PMV videos.

Modified Paths:
--------------
    scummvm/trunk/engines/made/pmvplayer.cpp
    scummvm/trunk/engines/made/pmvplayer.h

Modified: scummvm/trunk/engines/made/pmvplayer.cpp
===================================================================
--- scummvm/trunk/engines/made/pmvplayer.cpp	2008-04-21 08:51:25 UTC (rev 31640)
+++ scummvm/trunk/engines/made/pmvplayer.cpp	2008-04-21 11:05:44 UTC (rev 31641)
@@ -48,8 +48,6 @@
 	_fd->read(_palette, 768);
 	updatePalette();
 
-	//FILE *raw = fopen("track.raw", "wb");
-
 	uint32 frameCount = 0;
 
 	// TODO: Sound can still be a little choppy. A bug in the decoder or -
@@ -66,6 +64,7 @@
 		byte *frameData = new byte[chunkSize];
 		_fd->read(frameData, chunkSize);
 
+		// Handle audio
 		byte *audioData = frameData + READ_LE_UINT32(frameData + 8) - 8;
 		chunkSize = READ_LE_UINT16(audioData + 4);
 		uint16 chunkCount = READ_LE_UINT16(audioData + 6);
@@ -78,9 +77,17 @@
 		byte *soundData = new byte[soundSize];
 		decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
 		_audioStream->queueBuffer(soundData, soundSize);
-		
-		//fwrite(soundData, soundSize, 1, raw);
 
+		// Handle palette
+		uint32 palChunkOfs = READ_LE_UINT32(frameData + 16);
+		if (palChunkOfs) {
+			byte *palData = frameData + palChunkOfs - 8;
+			uint32 palSize = READ_LE_UINT32(palData + 4);
+			decompressPalette(palData + 8, _palette, palSize);
+			updatePalette();
+		}
+
+		// Handle video
 		byte *imageData = frameData + READ_LE_UINT32(frameData + 12) - 8;
 
 		uint32 frameNum = READ_LE_UINT32(frameData);
@@ -101,16 +108,17 @@
 
 		decompressImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize, frameNum > 0);
 
+		delete[] frameData;
+			
 		handleEvents();
 		updateScreen();
 
-		delete[] frameData;
-
 		frameCount++;
 
 		while (_mixer->getSoundElapsedTime(_audioStreamHandle) < frameCount * frameDelay) {
 			_system->delayMillis(10);
 		}
+
 	}
 
 	_audioStream->finish();
@@ -120,15 +128,14 @@
 	delete _fd;
 	delete _surface;
 
-	//fclose(raw);
-
 }
 
 void PmvPlayer::readChunk(uint32 &chunkType, uint32 &chunkSize) {
 	chunkType = _fd->readUint32BE();
 	chunkSize = _fd->readUint32LE();
 
-	debug(2, "chunkType = %c%c%c%c; chunkSize = %d\n",
+	debug(2, "ofs = %08X; chunkType = %c%c%c%c; chunkSize = %d\n",
+		_fd->pos(),
 		(chunkType >> 24) & 0xFF, (chunkType >> 16) & 0xFF, (chunkType >> 8) & 0xFF, chunkType & 0xFF,
 		chunkSize);
 
@@ -168,4 +175,16 @@
 	_system->updateScreen();
 }
 
+void PmvPlayer::decompressPalette(byte *palData, byte *outPal, uint32 palDataSize) {
+	byte *palDataEnd = palData + palDataSize;
+	while (palData < palDataEnd) {
+		byte count = *palData++;
+		byte entry = *palData++;
+		if (count == 255 && entry == 255)
+			break;
+		memcpy(&outPal[entry * 3], palData, (count + 1) * 3);
+		palData += (count + 1) * 3;
+	}
 }
+
+}

Modified: scummvm/trunk/engines/made/pmvplayer.h
===================================================================
--- scummvm/trunk/engines/made/pmvplayer.h	2008-04-21 08:51:25 UTC (rev 31640)
+++ scummvm/trunk/engines/made/pmvplayer.h	2008-04-21 11:05:44 UTC (rev 31641)
@@ -32,6 +32,7 @@
 	void handleEvents();
 	void updatePalette();
 	void updateScreen();
+	void decompressPalette(byte *palData, byte *outPal, uint32 palDataSize);
 };
 
 }


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