[Scummvm-git-logs] scummvm master -> c963b2c3b40d5b181232994385b6cbf2d6ac2abc
sev-
noreply at scummvm.org
Sun Aug 13 08:57:27 UTC 2023
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
4e1cdb73b4 DIRECTOR: Refactor loading cast when building framesOffset
ffd515fe6a DIRECTOR: Refactor score loading and remove framesOffset
c963b2c3b4 DIRECTOR: Fix `chan <frameNum>` debugger command
Commit: 4e1cdb73b49a733630172d27ac366a46e7f08d5d
https://github.com/scummvm/scummvm/commit/4e1cdb73b49a733630172d27ac366a46e7f08d5d
Author: Harishankar Kumar (hari01584 at gmail.com)
Date: 2023-08-13T10:57:23+02:00
Commit Message:
DIRECTOR: Refactor loading cast when building framesOffset
This patch refactors the code that builds the framesOffsets table,
initially each frame of movie was being parsed and sprite casts loaded
then was being discarded, this was not very efficient. Refactored code
to load cast only when they are required, thus reducing the time to load
a movie.
Fixed slow loading of large movies in `totaldistortion-win`
--start-movie="ATD/HD/ADTDVSVF/TDVIDDB1.DIR" totaldistortion-win
Changed paths:
engines/director/score.cpp
engines/director/score.h
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 6f355120eae..019e02251a2 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -446,7 +446,7 @@ void Score::update() {
}
}
- loadFrame(_curFrameNumber);
+ loadFrame(_curFrameNumber, true);
byte tempo = _currentFrame->_mainChannels.tempo;
@@ -1455,7 +1455,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
// Calculate number of frames and their positions
// numOfFrames in the header is often incorrect
- for (_numFrames = 1; loadFrame(_numFrames); _numFrames++) {
+ for (_numFrames = 1; loadFrame(_numFrames, false); _numFrames++) {
if (_framesStream->pos() < _framesStreamSize) {
// Record the starting offset for next frame
_frameOffsets.push_back(_framesStream->pos());
@@ -1466,7 +1466,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
_currentFrame->reset();
- loadFrame(1);
+ loadFrame(1, true);
// Read over frame offset array and print each item
for (uint i = 0; i < _frameOffsets.size(); i++) {
@@ -1476,7 +1476,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
debugC(1, kDebugLoading, "Score::loadFrames(): Number of frames: %d, framesStreamSize: %d", _numFrames, _framesStreamSize);
}
-bool Score::loadFrame(int frameNum) {
+bool Score::loadFrame(int frameNum, bool loadCast) {
debugC(7, kDebugLoading, "****** Frame request %d, current pos: %ld", frameNum, _framesStream->pos());
// Read existing frame (ie already visited)
@@ -1499,8 +1499,10 @@ bool Score::loadFrame(int frameNum) {
if (!isFrameRead)
return false;
- // Load frame cast
- setSpriteCasts();
+ if (loadCast) {
+ // Load frame cast
+ setSpriteCasts();
+ }
return true;
}
@@ -1588,7 +1590,7 @@ Frame *Score::getFrameData(int frameNum){
Frame *frame = _currentFrame;
_currentFrame = nullptr; // To avoid later deletion of frame inside renderOneFrame()
- bool isFrameRead = loadFrame(frameNum);
+ bool isFrameRead = loadFrame(frameNum, false);
// Start restoring all states
_curFrameNumber = curFrameNumber;
diff --git a/engines/director/score.h b/engines/director/score.h
index 8707c8889bc..050c8bb8a14 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -73,7 +73,7 @@ public:
Movie *getMovie() const { return _movie; }
void loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version);
- bool loadFrame(int frame);
+ bool loadFrame(int frame, bool loadCast);
bool readOneFrame();
void updateFrame(Frame *frame);
Frame *getFrameData(int frameNum);
Commit: ffd515fe6a30075588280d604243899a3e54facd
https://github.com/scummvm/scummvm/commit/ffd515fe6a30075588280d604243899a3e54facd
Author: Harishankar Kumar (hari01584 at gmail.com)
Date: 2023-08-13T10:57:23+02:00
Commit Message:
DIRECTOR: Refactor score loading and remove framesOffset
This patch completely removes framesOffset and rebuildChannelData()
The framesOffset was used to store the number of frames and their
starting position in frame stream, however this information is not
needed as when in frames jumping, all the channels needed to be built
from frame 1, thus only position of first frame is needed.
Changed paths:
engines/director/score.cpp
engines/director/score.h
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 019e02251a2..ec612f838af 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -403,7 +403,6 @@ void Score::update() {
if (_nextFrame) {
// With the advent of demand loading frames and due to partial updates, we rebuild our channel data
// when jumping.
- rebuildChannelData(_nextFrame);
_curFrameNumber = _nextFrame;
}
else if (!_window->_newMovieStarted)
@@ -425,7 +424,6 @@ void Score::update() {
return;
}
- rebuildChannelData(ref.frameI);
_curFrameNumber = ref.frameI;
} else {
if (debugChannelSet(-1, kDebugNoLoop)) {
@@ -1440,27 +1438,19 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
// TODO Merge it with shared cast
_currentFrame = new Frame(this, _numChannelsDisplayed);
- // This makes all indexing simpler
- _frameOffsets.push_back(0);
-
_currentTempo = 0;
_currentPaletteId = CastMemberID(0, 0);
// Prepare frameOffsets
_version = version;
- _frameOffsets.push_back(_framesStream->pos());
+ _firstFramePosition = _framesStream->pos();
// Pre-computing number of frames, as sometimes the frameNumber in stream mismatches
debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames!");
// Calculate number of frames and their positions
// numOfFrames in the header is often incorrect
- for (_numFrames = 1; loadFrame(_numFrames, false); _numFrames++) {
- if (_framesStream->pos() < _framesStreamSize) {
- // Record the starting offset for next frame
- _frameOffsets.push_back(_framesStream->pos());
- }
- }
+ for (_numFrames = 1; loadFrame(_numFrames, false); _numFrames++) { }
debugC(1, kDebugLoading, "Score::loadFrames(): Calculated, total number of frames %d!", _numFrames);
@@ -1468,10 +1458,6 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
loadFrame(1, true);
- // Read over frame offset array and print each item
- for (uint i = 0; i < _frameOffsets.size(); i++) {
- debugC(8, kDebugLoading, "Score::loadFrames(): Frame %d, offset %ld", i, _frameOffsets[i]);
- }
debugC(1, kDebugLoading, "Score::loadFrames(): Number of frames: %d, framesStreamSize: %d", _numFrames, _framesStreamSize);
}
@@ -1479,26 +1465,33 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
bool Score::loadFrame(int frameNum, bool loadCast) {
debugC(7, kDebugLoading, "****** Frame request %d, current pos: %ld", frameNum, _framesStream->pos());
- // Read existing frame (ie already visited)
- if (frameNum < (int)_frameOffsets.size()) {
- // Seek to existing frame in offsets
- _framesStream->seek(_frameOffsets[frameNum]);
- } else {
- // Seek to latest frame
- _framesStream->seek(_frameOffsets[_frameOffsets.size() - 1]);
- _curFrameNumber = _frameOffsets.size() - 1;
+ int sourceFrame = _curFrameNumber;
+ int targetFrame = frameNum;
+
+ if (frameNum <= (int)_curFrameNumber) {
+ debugC(7, kDebugLoading, "****** Resetting frame %d to start %ld", sourceFrame, _framesStream->pos());
+ // If we are going back, we need to rebuild frames from start
+ _currentFrame->reset();
+ sourceFrame = 0;
+
+ // Reset position to start
+ _framesStream->seek(_firstFramePosition);
}
- debugC(7, kDebugLoading, "****** Frame request %d, current offset %ld", frameNum, _framesStream->pos());
+ debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset %ld", sourceFrame, targetFrame, _framesStream->pos());
- while (_frameOffsets.size() <= (uint)frameNum && readOneFrame())
- _curFrameNumber++;
+ while (sourceFrame < targetFrame - 1 && readOneFrame()) {
+ sourceFrame++;
+ }
// Finally read the target frame!
bool isFrameRead = readOneFrame();
if (!isFrameRead)
return false;
+ // We have read the frame, now update current frame number
+ _curFrameNumber = targetFrame;
+
if (loadCast) {
// Load frame cast
setSpriteCasts();
@@ -1507,33 +1500,6 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
return true;
}
-// Rebuild channel data from frame 1 to frameNum, to prepare for next frame loading
-// Why? Because director works on concept of "delta" changes between frame, to save
-// space each frame only contains changes from previous frame, so we need to rebuild
-// whole channel data if we were to make a very big jump. This is essential because
-// without it we might have leftover casts/properties which will interfere with channel
-// data after the jump
-void Score::rebuildChannelData(int frameNum) {
- // Builds channel data from frame 1 to frame
- if (frameNum > (int)_numFrames) {
- warning("Score::rebuildChannelData(): frameNum %d is greater than total frames %d", frameNum, _numFrames);
- return;
- }
-
- // Lock variables
- int curFrameNumber = _curFrameNumber;
-
- _currentFrame->reset();
-
- _framesStream->seek(_frameOffsets[1]); // Seek to frame 1
- for (int i = 1; i < frameNum; i++) {
- readOneFrame();
- }
-
- // Unlock variables
- _curFrameNumber = curFrameNumber;
-}
-
bool Score::readOneFrame() {
uint16 channelSize;
uint16 channelOffset;
diff --git a/engines/director/score.h b/engines/director/score.h
index 050c8bb8a14..9f3f95b98c2 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -77,7 +77,6 @@ public:
bool readOneFrame();
void updateFrame(Frame *frame);
Frame *getFrameData(int frameNum);
- void rebuildChannelData(int frameNum);
void loadLabels(Common::SeekableReadStreamEndian &stream);
void loadActions(Common::SeekableReadStreamEndian &stream);
@@ -163,7 +162,7 @@ public:
uint8 _currentTempo;
CastMemberID _currentPaletteId;
- Common::Array<int64> _frameOffsets;
+ uint _firstFramePosition;
uint _framesStreamSize;
Common::MemoryReadStreamEndian *_framesStream;
Commit: c963b2c3b40d5b181232994385b6cbf2d6ac2abc
https://github.com/scummvm/scummvm/commit/c963b2c3b40d5b181232994385b6cbf2d6ac2abc
Author: Harishankar Kumar (hari01584 at gmail.com)
Date: 2023-08-13T10:57:23+02:00
Commit Message:
DIRECTOR: Fix `chan <frameNum>` debugger command
This patch fixes chan command, previously when called with frameNum it
was mutating the state of frame and thus crashing.
Changed paths:
engines/director/score.cpp
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index ec612f838af..b8e41af8266 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1552,18 +1552,20 @@ Frame *Score::getFrameData(int frameNum){
// Be sure to delete this frame after use
// Backup variables
- int curFrameNumber = _curFrameNumber;
- Frame *frame = _currentFrame;
- _currentFrame = nullptr; // To avoid later deletion of frame inside renderOneFrame()
-
+ int tempFrameNumber = _curFrameNumber;
+
bool isFrameRead = loadFrame(frameNum, false);
+ Frame *tempFrame = _currentFrame;
+
+ _currentFrame = new Frame(this, _numChannelsDisplayed);
+ loadFrame(frameNum, true);
+ Frame *frame = _currentFrame;
- // Start restoring all states
- _curFrameNumber = curFrameNumber;
- _currentFrame = frame;
+ _currentFrame = tempFrame;
+ _curFrameNumber = tempFrameNumber;
if (isFrameRead) {
- return _currentFrame;
+ return frame;
}
return nullptr;
}
More information about the Scummvm-git-logs
mailing list