VIDEO: Return decoded frame when force seeking SmackerDecoder

This commit is contained in:
SupSuper 2024-06-14 01:54:47 +01:00
parent aa629b7e30
commit f012b06812
2 changed files with 10 additions and 7 deletions

@ -451,7 +451,7 @@ bool SmackerDecoder::rewind() {
return true; return true;
} }
void SmackerDecoder::forceSeekToFrame(uint frame) { const Graphics::Surface *SmackerDecoder::forceSeekToFrame(uint frame) {
uint seekFrame; uint seekFrame;
if (frame >= 10) if (frame >= 10)
seekFrame = MAX<uint>(frame - 10, 0); seekFrame = MAX<uint>(frame - 10, 0);
@ -459,13 +459,13 @@ void SmackerDecoder::forceSeekToFrame(uint frame) {
seekFrame = 0; seekFrame = 0;
if (!isVideoLoaded()) if (!isVideoLoaded())
return; return nullptr;
if (seekFrame >= getFrameCount()) if (seekFrame >= getFrameCount())
return; return nullptr;
if (!rewind()) if (!rewind())
return; return nullptr;
stopAudio(); stopAudio();
SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0); SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0);
@ -484,10 +484,11 @@ void SmackerDecoder::forceSeekToFrame(uint frame) {
} }
if (!_fileStream->seek(startPos + offset, SEEK_SET)) if (!_fileStream->seek(startPos + offset, SEEK_SET))
return; return nullptr;
const Graphics::Surface *surface = nullptr;
while (getCurFrame() < (int)frame) { while (getCurFrame() < (int)frame) {
decodeNextFrame(); surface = decodeNextFrame();
} }
_lastTimeChange = videoTrack->getFrameTime(frame); _lastTimeChange = videoTrack->getFrameTime(frame);
@ -495,6 +496,7 @@ void SmackerDecoder::forceSeekToFrame(uint frame) {
_startTime = g_system->getMillis() - (_lastTimeChange.msecs() / getRate()).toInt(); _startTime = g_system->getMillis() - (_lastTimeChange.msecs() / getRate()).toInt();
} }
resetPauseStartTime(); resetPauseStartTime();
return surface;
} }
void SmackerDecoder::readNextPacket() { void SmackerDecoder::readNextPacket() {

@ -64,6 +64,7 @@ typedef Common::BitStreamImpl<Common::BitStreamMemoryStream, uint32, 8, false, f
* *
* Video decoder used in engines: * Video decoder used in engines:
* - agos * - agos
* - bagel
* - saga * - saga
* - scumm (he) * - scumm (he)
* - sword1 * - sword1
@ -79,7 +80,7 @@ public:
virtual bool loadStream(Common::SeekableReadStream *stream); virtual bool loadStream(Common::SeekableReadStream *stream);
void close(); void close();
void forceSeekToFrame(uint frame); const Graphics::Surface *forceSeekToFrame(uint frame);
bool rewind(); bool rewind();
Common::Rational getFrameRate() const; Common::Rational getFrameRate() const;