aboutsummaryrefslogtreecommitdiff
path: root/graphics/smk_player.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2008-12-16 13:19:43 +0000
committerFilippos Karapetis2008-12-16 13:19:43 +0000
commit2706e527c214cfcc77502b3bdb639d5a341d3c1a (patch)
treea6a279de5f08e19a277c0d4004d7f6c0ddde50ed /graphics/smk_player.cpp
parent0b1d31383b6b7978903e4c8c40de010506709937 (diff)
downloadscummvm-rg350-2706e527c214cfcc77502b3bdb639d5a341d3c1a.tar.gz
scummvm-rg350-2706e527c214cfcc77502b3bdb639d5a341d3c1a.tar.bz2
scummvm-rg350-2706e527c214cfcc77502b3bdb639d5a341d3c1a.zip
- Some more comments
- The audio header is now decoded properly (still no audio support) svn-id: r35392
Diffstat (limited to 'graphics/smk_player.cpp')
-rw-r--r--graphics/smk_player.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/graphics/smk_player.cpp b/graphics/smk_player.cpp
index ccecea7b07..ba7c556f82 100644
--- a/graphics/smk_player.cpp
+++ b/graphics/smk_player.cpp
@@ -373,9 +373,20 @@ bool SMKPlayer::loadFile(const char *fileName) {
_header.height = _fileStream->readUint32LE();
_header.frames = _fileStream->readUint32LE();
_header.frameRate = (int32)_fileStream->readUint32LE();
+ // Flags are determined by which bit is set, which can be one of the following:
+ // 0 - set to 1 if file contains a ring frame.
+ // 1 - set to 1 if file is Y-interlaced
+ // 2 - set to 1 if file is Y-doubled
+ // If bits 1 or 2 are set, the frame should be scaled to twice its height
+ // before it is displayed.
_header.flags = _fileStream->readUint32LE();
- unsigned int i;
+ // TODO: should we do any extra processing for Smacker files with ring frames?
+
+ // TODO: should we do any extra processing for Y-doubled videos? Are they the
+ // same as Y-interlaced videos?
+
+ uint32 i;
for (i = 0; i < 7; ++i)
_header.audioSize[i] = _fileStream->readUint32LE();
@@ -385,8 +396,26 @@ bool SMKPlayer::loadFile(const char *fileName) {
_header.fullSize = _fileStream->readUint32LE();
_header.typeSize = _fileStream->readUint32LE();
- for (i = 0; i < 7; ++i)
- _header.audioRate[i] = _fileStream->readUint32LE();
+ uint32 audioInfo;
+ for (i = 0; i < 7; ++i) {
+ // AudioRate - Frequency and format information for each sound track, up to 7 audio tracks.
+ // The 32 constituent bits have the following meaning:
+ // * bit 31 - data is compressed
+ // * bit 30 - indicates that audio data is present for this track
+ // * bit 29 - 1 = 16-bit audio; 0 = 8-bit audio
+ // * bit 28 - 1 = stereo audio; 0 = mono audio
+ // * bits 27-26 - if both set to zero - use v2 sound decompression
+ // * bits 25-24 - unused
+ // * bits 23-0 - audio sample rate
+ audioInfo = _fileStream->readUint32LE();
+ _header.audioInfo[i].isCompressed = audioInfo & 0x80000000;
+ _header.audioInfo[i].hasAudio = audioInfo & 0x40000000;
+ _header.audioInfo[i].is16Bits = audioInfo & 0x20000000;
+ _header.audioInfo[i].isStereo = audioInfo & 0x10000000;
+ _header.audioInfo[i].hasV2Compression = !(audioInfo & 0x8000000) &&
+ !(audioInfo & 0x4000000);
+ _header.audioInfo[i].sampleRate = audioInfo & 0xFFFFFF;
+ }
_header.dummy = _fileStream->readUint32LE();
@@ -436,7 +465,7 @@ void SMKPlayer::closeFile() {
}
void SMKPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) {
- uint h = _header.height;
+ uint h = (_header.flags ? 2 : 1) * _header.height;
uint w = _header.width;
byte *src = _image;
@@ -462,13 +491,15 @@ bool SMKPlayer::decodeNextFrame() {
setPalette(_palette);
}
- // TODO: Audio support
- // Skip audio tracks for now
+ // Load audio tracks
for (i = 0; i < 7; ++i) {
if (!(_frameTypes[_currentSMKFrame] & (2 << i)))
continue;
uint32 len = _fileStream->readUint32LE();
+
+ // TODO: Audio support
+
//uint32 unpackedLen = _fileStream->readUint32LE();
_fileStream->skip(len - 4);
}