From 6ec870303ff3532873f652fb1a565d72b0079645 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 20 May 2009 10:43:18 +0000 Subject: - Reverted commit #40730, as it introduced rounding errors - Properly fixed the FLIC player - The sound chunk tag of DXA files is now read by the DXADecoder's loadFile() method svn-id: r40736 --- graphics/video/dxa_player.cpp | 12 ++++++++---- graphics/video/dxa_player.h | 6 ++++++ graphics/video/flic_player.cpp | 10 ++++++---- graphics/video/smk_player.cpp | 12 ++++++------ graphics/video/video_player.cpp | 4 ++-- graphics/video/video_player.h | 18 ++++++------------ 6 files changed, 34 insertions(+), 28 deletions(-) (limited to 'graphics/video') diff --git a/graphics/video/dxa_player.cpp b/graphics/video/dxa_player.cpp index 55fe869fc4..d0d4d1c67b 100644 --- a/graphics/video/dxa_player.cpp +++ b/graphics/video/dxa_player.cpp @@ -86,13 +86,13 @@ bool DXADecoder::loadFile(const char *fileName) { if (frameRate > 0) { _videoInfo.frameRate = 1000 / frameRate; - _videoInfo.frameDelay = frameRate; + _videoInfo.frameDelay = frameRate * 100; } else if (frameRate < 0) { _videoInfo.frameRate = 100000 / (-frameRate); - _videoInfo.frameDelay = -frameRate / 100; + _videoInfo.frameDelay = -frameRate; } else { _videoInfo.frameRate = 10; - _videoInfo.frameDelay = 100; + _videoInfo.frameDelay = 10000; } _videoInfo.width = _fileStream->readUint16BE(); @@ -155,9 +155,13 @@ bool DXADecoder::loadFile(const char *fileName) { } while (tag != 0); } #endif + + // Read the sound header + _soundTag = _fileStream->readUint32BE(); + _videoInfo.currentFrame = 0; - _videoInfo.frameOffs = _fileStream->pos(); + _videoInfo.firstframeOffset = _fileStream->pos(); return true; } diff --git a/graphics/video/dxa_player.h b/graphics/video/dxa_player.h index 15fb4aa168..384a057c3f 100644 --- a/graphics/video/dxa_player.h +++ b/graphics/video/dxa_player.h @@ -55,6 +55,11 @@ public: bool decodeNextFrame(); + /** + * Get the sound chunk tag of the loaded DXA file + */ + uint32 getSoundTag() { return _soundTag; } + private: void decodeZlib(byte *data, int size, int totalSize); void decode12(int size); @@ -76,6 +81,7 @@ private: uint16 _curHeight; uint32 _frameSize; ScaleMode _scaleMode; + uint32 _soundTag; }; } // End of namespace Graphics diff --git a/graphics/video/flic_player.cpp b/graphics/video/flic_player.cpp index 29c83e9d0e..e58cf0bdbc 100644 --- a/graphics/video/flic_player.cpp +++ b/graphics/video/flic_player.cpp @@ -72,8 +72,9 @@ bool FlicDecoder::loadFile(const char *fileName) { } _fileStream->readUint16LE(); // flags // Note: The normal delay is a 32-bit integer (dword), whereas the overriden delay is a 16-bit integer (word) - _videoInfo.frameDelay = _fileStream->readUint32LE(); // frameDelay is the FLIC "speed", in milliseconds - _videoInfo.frameRate = 1000 / _videoInfo.frameDelay; + // frameDelay is the FLIC "speed", in milliseconds. Our frameDelay is calculated in 1/100 ms, so we convert it here + _videoInfo.frameDelay = 100 * _fileStream->readUint32LE(); + _videoInfo.frameRate = 100 * 1000 / _videoInfo.frameDelay; _fileStream->seek(80); _offsetFrame1 = _fileStream->readUint32LE(); @@ -206,10 +207,11 @@ bool FlicDecoder::decodeNextFrame() { case FRAME_TYPE: { chunkCount = _fileStream->readUint16LE(); // Note: The overriden delay is a 16-bit integer (word), whereas the normal delay is a 32-bit integer (dword) + // frameDelay is the FLIC "speed", in milliseconds. Our frameDelay is calculated in 1/100 ms, so we convert it here uint16 newFrameDelay = _fileStream->readUint16LE(); // "speed", in milliseconds if (newFrameDelay > 0) { - _videoInfo.frameDelay = newFrameDelay; - _videoInfo.frameRate = 1000 / _videoInfo.frameDelay; + _videoInfo.frameDelay = 100 * newFrameDelay; + _videoInfo.frameRate = 100 * 1000 / _videoInfo.frameDelay; } _fileStream->readUint16LE(); // reserved, always 0 uint16 newWidth = _fileStream->readUint16LE(); diff --git a/graphics/video/smk_player.cpp b/graphics/video/smk_player.cpp index 9ed8e9902f..ebbf61d25a 100644 --- a/graphics/video/smk_player.cpp +++ b/graphics/video/smk_player.cpp @@ -344,9 +344,9 @@ int32 SmackerDecoder::getAudioLag() { and how much time *should* have passed. */ - audioTime = g_system->getMillis() - _videoInfo.startTime; + audioTime = (g_system->getMillis() - _videoInfo.startTime) * 100; } else - audioTime = (int32) _mixer->getSoundElapsedTime(_audioHandle); + audioTime = (((int32) _mixer->getSoundElapsedTime(_audioHandle)) * 100); return videoTime - audioTime; } @@ -380,13 +380,13 @@ bool SmackerDecoder::loadFile(const char *fileName) { if (frameRate > 0) { _videoInfo.frameRate = 1000 / frameRate; - _videoInfo.frameDelay = frameRate; + _videoInfo.frameDelay = frameRate * 100; } else if (frameRate < 0) { _videoInfo.frameRate = 100000 / (-frameRate); - _videoInfo.frameDelay = -frameRate / 100; + _videoInfo.frameDelay = -frameRate; } else { _videoInfo.frameRate = 10; - _videoInfo.frameDelay = 100; + _videoInfo.frameDelay = 10000; } // Flags are determined by which bit is set, which can be one of the following: @@ -473,7 +473,7 @@ bool SmackerDecoder::loadFile(const char *fileName) { _palette = (byte *)malloc(3 * 256); memset(_palette, 0, 3 * 256); - _videoInfo.frameOffs = _fileStream->pos(); + _videoInfo.firstframeOffset = _fileStream->pos(); return true; } diff --git a/graphics/video/video_player.cpp b/graphics/video/video_player.cpp index b77cb3b7f7..81c025d22f 100644 --- a/graphics/video/video_player.cpp +++ b/graphics/video/video_player.cpp @@ -88,14 +88,14 @@ int32 VideoDecoder::getAudioLag() { Calculate the lag by how much time has gone by since the first frame and how much time *should* have passed. */ - int32 audioTime = g_system->getMillis() - _videoInfo.startTime; + int32 audioTime = (g_system->getMillis() - _videoInfo.startTime) * 100; int32 videoTime = _videoInfo.currentFrame * getFrameDelay(); return videoTime - audioTime; } uint32 VideoDecoder::getFrameWaitTime() { - int32 waitTime = getFrameDelay() + getAudioLag(); + int32 waitTime = (getFrameDelay() + getAudioLag()) / 100; if (waitTime < 0) return 0; diff --git a/graphics/video/video_player.h b/graphics/video/video_player.h index ef878aa61b..eb02032b50 100644 --- a/graphics/video/video_player.h +++ b/graphics/video/video_player.h @@ -75,16 +75,16 @@ public: virtual int32 getFrameRate(); /** - * Returns the time to wait for each frame in ms - * @return the time to wait for each frame in ms + * Returns the time to wait for each frame in 1/100 ms (to avoid rounding errors) + * @return the time to wait for each frame in 1/100 ms (to avoid rounding errors) */ virtual int32 getFrameDelay(); /** - * Returns the current A/V lag in ms + * Returns the current A/V lag in 1/100 ms (to avoid rounding errors) * If > 0, audio lags behind * If < 0, video lags behind - * @return the current A/V lag in ms + * @return the current A/V lag in 1/100 ms (to avoid rounding errors) */ virtual int32 getAudioLag(); @@ -158,20 +158,14 @@ public: */ virtual bool decodeNextFrame() = 0; - /** - * Used to read the sound header from DXA files. It's not pretty, - * but it's slightly better than exposing _fileStream - */ - uint32 readSoundHeader() { return _fileStream->readUint32BE(); } - protected: struct { uint32 width; uint32 height; uint32 frameCount; int32 frameRate; - int32 frameDelay; // ms - uint32 frameOffs; + int32 frameDelay; // 1/100 ms (to avoid rounding errors) + uint32 firstframeOffset; uint32 currentFrame; uint32 startTime; } _videoInfo; -- cgit v1.2.3