mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-07 18:31:37 +00:00
TITANIC: Support cutscene frame counting beyond end of video
The intro credits cutscene at least, uses an end frame beyond the video as a way of adding an extra delay after the video finishes
This commit is contained in:
parent
31fd315c90
commit
5348f4f34f
@ -41,6 +41,7 @@ AVISurface::AVISurface(const CResourceKey &key) {
|
||||
_streamCount = 0;
|
||||
_movieFrameSurface[0] = _movieFrameSurface[1] = nullptr;
|
||||
_framePixels = nullptr;
|
||||
_priorFrameTime = 0;
|
||||
|
||||
// Reset current frame. We need to keep track of frames separately from the decoder,
|
||||
// since it needs to be able to go beyond the frame count or to negative to allow
|
||||
@ -287,8 +288,20 @@ void AVISurface::setFrame(int frameNumber) {
|
||||
renderFrame();
|
||||
}
|
||||
|
||||
bool AVISurface::isNextFrame() const {
|
||||
return _decoder->getTimeToNextFrame() == 0;
|
||||
bool AVISurface::isNextFrame() {
|
||||
if (!_decoder->endOfVideo())
|
||||
return _decoder->getTimeToNextFrame() == 0;
|
||||
|
||||
// We're at the end of the video, so we need to manually
|
||||
// keep track of frame delays. Hardcoded at the moment for 15FPS
|
||||
const uint FRAME_TIME = 1000 / 15;
|
||||
uint32 currTime = g_system->getMillis();
|
||||
if (currTime >= (_priorFrameTime + FRAME_TIME)) {
|
||||
_priorFrameTime = currTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AVISurface::renderFrame() {
|
||||
@ -376,11 +389,12 @@ void AVISurface::playCutscene(const Rect &r, uint startFrame, uint endFrame) {
|
||||
_movieFrameSurface[0]->h != r.height();
|
||||
|
||||
startAtFrame(startFrame);
|
||||
_currentFrame = startFrame;
|
||||
|
||||
while (_currentFrame < (int)endFrame && !g_vm->shouldQuit()) {
|
||||
if (isNextFrame()) {
|
||||
renderFrame();
|
||||
_currentFrame = _decoder->endOfVideo() ? _decoder->getFrameCount() :
|
||||
_decoder->getCurFrame();
|
||||
++_currentFrame;
|
||||
|
||||
if (isDifferent) {
|
||||
// Clear the destination area, and use the transBlitFrom method,
|
||||
|
@ -66,6 +66,7 @@ private:
|
||||
Graphics::ManagedSurface *_framePixels;
|
||||
bool _isReversed;
|
||||
int _currentFrame;
|
||||
uint32 _priorFrameTime;
|
||||
private:
|
||||
/**
|
||||
* Render a frame to the video surface
|
||||
@ -196,7 +197,7 @@ public:
|
||||
/**
|
||||
* Returns true if it's time for the next
|
||||
*/
|
||||
bool isNextFrame() const;
|
||||
bool isNextFrame();
|
||||
|
||||
/**
|
||||
* Plays an interruptable cutscene
|
||||
|
Loading…
Reference in New Issue
Block a user