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

View File

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

View File

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