aboutsummaryrefslogtreecommitdiff
path: root/graphics/video
diff options
context:
space:
mode:
authorFilippos Karapetis2009-05-20 10:43:18 +0000
committerFilippos Karapetis2009-05-20 10:43:18 +0000
commit6ec870303ff3532873f652fb1a565d72b0079645 (patch)
tree2acf20a4ae5d4deac4be47e3518c20409089f8bb /graphics/video
parentcaf9bf0941babc523be7c37bb10bfbb2213f5c0b (diff)
downloadscummvm-rg350-6ec870303ff3532873f652fb1a565d72b0079645.tar.gz
scummvm-rg350-6ec870303ff3532873f652fb1a565d72b0079645.tar.bz2
scummvm-rg350-6ec870303ff3532873f652fb1a565d72b0079645.zip
- 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
Diffstat (limited to 'graphics/video')
-rw-r--r--graphics/video/dxa_player.cpp12
-rw-r--r--graphics/video/dxa_player.h6
-rw-r--r--graphics/video/flic_player.cpp10
-rw-r--r--graphics/video/smk_player.cpp12
-rw-r--r--graphics/video/video_player.cpp4
-rw-r--r--graphics/video/video_player.h18
6 files changed, 34 insertions, 28 deletions
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;